我个人使用c++的风格总是把类声明放在包含文件中,定义放在。cpp文件中,这很像Loki对c++头文件的回答,代码分离。不可否认,我喜欢这种风格的部分原因可能与我花了这么多年来编写Modula-2和Ada有关,这两者都有类似的规范文件和主体文件方案。

我有一个同事,他比我更了解c++,他坚持认为所有c++声明都应该尽可能地在头文件中包含定义。他并不是说这是一种有效的替代风格,甚至不是一种稍微更好的风格,而是说这是一种新的普遍接受的风格,现在每个人都在使用c++。

我不像以前那么灵活了,所以在我看到更多的人和他在一起之前,我并不急于加入他的行列。那么这个习语到底有多普遍呢?

只是给答案一些结构:现在的方式™,非常常见,有点常见,不常见,还是疯狂?


当前回答

恕我直言,他只有在做模板和/或元编程时才有价值。前面已经提到了将头文件限制为声明的很多原因。他们只是…头。如果您希望包含代码,则将其编译为库并将其链接起来。

其他回答

通常,当编写一个新类时,我会把所有的代码放在类中,所以我不必在另一个文件中寻找它。在一切正常工作之后,我将方法的主体分解到cpp文件中,将原型留在hpp文件中。

头文件中的代码通常是一个坏主意,因为当您更改实际代码而不是声明时,它会强制重新编译包含头文件的所有文件。它还会降低编译速度,因为您需要解析每个包含头的文件中的代码。

将代码放在头文件中的一个原因是,当使用其他cpp文件中实例化的模板时,关键字inline通常需要它才能正常工作。

恕我直言,他只有在做模板和/或元编程时才有价值。前面已经提到了将头文件限制为声明的很多原因。他们只是…头。如果您希望包含代码,则将其编译为库并将其链接起来。

为了增加更多的乐趣,你可以添加.ipp文件,其中包含模板实现(包含在.hpp中),而.hpp包含接口。

除了模板化的代码(取决于项目,这可能是大部分或少数文件),还有正常的代码,这里最好将声明和定义分开。在需要的地方也提供前向声明——这可能会影响编译时间。

我认为你的同事是对的,只要他没有进入这个过程,在头部写可执行代码。 我认为,正确的平衡是遵循GNAT Ada所指出的路径,其中.ads文件为其用户和其子程序包提供了完全适当的接口定义。

顺便说一句,Ted,你有没有在这个论坛上看到最近关于Ada绑定到CLIPS库的问题,这个问题是你几年前写的,现在已经没有了(相关的网页现在已经关闭了)。即使使用的是旧的Clips版本,对于愿意在Ada 2012程序中使用Clips推理引擎的人来说,这个绑定也是一个很好的开始示例。