编码C++;(主要)在头文件和.cpp文件中 多年来,我一直以标准的方式编写C++,在头文件中使用类声明。最近,我搬到了一家新公司,那里的代码(似乎受boost编码风格的影响)完全编码在.hpp文件中,一个简短的.cpp文件包含头文件并创建对象/程序二进制文件

编码C++;(主要)在头文件和.cpp文件中 多年来,我一直以标准的方式编写C++,在头文件中使用类声明。最近,我搬到了一家新公司,那里的代码(似乎受boost编码风格的影响)完全编码在.hpp文件中,一个简短的.cpp文件包含头文件并创建对象/程序二进制文件,c++,build,C++,Build,这让我思考-与为每个对象编写.hpp和.cpp文件相比,在头文件中编写代码有哪些优点/缺点?这假设我们的项目不创建公共库,这些库随后链接到程序二进制文件中,而是每个程序二进制文件都是从头文件(和一个source.cpp文件)的总和构建的。这是C++的新趋势吗? 例如,模板对象只需要是头文件,但将非模板类放入头文件,然后简单地将这些公共项目类包含在二进制文件中似乎是个好主意。假设您从头开始创建一个新的代码库,这是否意味着更少的链接,这可能意味着更少的链接错误和更快的构建。预编译的头文件功能是否也意

这让我思考-与为每个对象编写.hpp和.cpp文件相比,在头文件中编写代码有哪些优点/缺点?这假设我们的项目不创建公共库,这些库随后链接到程序二进制文件中,而是每个程序二进制文件都是从头文件(和一个source.cpp文件)的总和构建的。这是C++的新趋势吗?

例如,模板对象只需要是头文件,但将非模板类放入头文件,然后简单地将这些公共项目类包含在二进制文件中似乎是个好主意。假设您从头开始创建一个新的代码库,这是否意味着更少的链接,这可能意味着更少的链接错误和更快的构建。预编译的头文件功能是否也意味着使用头文件可以加快构建时间?还是因为我们现在在创建二进制文件时需要编译所有代码,而不是链接公共共享库对象,所以构建时间更长了

还要注意的是,我们在这里没有编写API(在这种情况下,类似pimpl的习惯用法会通过隐藏实现给我们带来更大的灵活性),我们编写的程序是在客户站点上运行的


提前谢谢,

在我的脑海里:

优势:
  • 实施可见(更多的是一个弱点,但取决于具体情况)
  • 无需导出到库
  • 编译器有更好的机会优化某些代码
弱点:
  • 实现可见
  • 较慢的构建时间
  • 膨胀的头文件
  • 实现中的更改将需要完全重建,而将实现放在实现文件中不会(仅编译该特定文件或库)
  • 对于循环依赖项,使用前向声明,并且只在实现文件中包含完整类型。如果你只有一个标题,这就不可能了

我肯定还有其他的,如果我能想到更多的,我会编辑的。

公共库是一回事,代码的通用重用性是另一回事。如果您想使用您在另一个项目中编写的一些代码,您可能需要复制粘贴大量代码,然后维护单独的代码库。编译时间将变得更长,因为程序将是一个大的编译单元,而不是许多cpp/h文件,其中只有这些文件(包括修改过的头文件)将被重新编译。例如,我目前正在开发的应用程序的完整构建需要7分钟。如果更改不严重,重新编译大约需要15秒。最后,代码的可读性可能会降低。头文件让您快速了解创建类的目的以及如何使用它。如果类是就地编写的,那么您将不得不不必要地挖掘源代码。

仅标题库往往会使构建系统更容易,而且通常您不需要关心依赖关系

另一方面,将代码移动到实现文件可以更容易地控制模块边界和创建可交换的二进制模块,这可以改进增量构建。成本更多的是“内务”。
我的直觉是更喜欢实现文件,并且有一些数据点支持我,比如来自建议的Boost网络库的作者

更快的完整构建?我不知道。但是有了这个方案,你总是可以得到完整的版本。是的,完整的版本是唯一的选择,因为只有源文件才能创建最终的二进制文件。你不是混淆了优点和缺点吗?另外,你可能想明确指出你所说的哪种方法的优点/缺点?@AmbrozBizjak我已经注意到了。编辑。感谢Luchian的回答,听起来人们对在大型项目中将所有代码放入头文件的想法不太感兴趣。你错过了“优点”上的“添加到项目中非常容易,而无需跳过大量依赖项构建环”。当你在这样一个环境中工作时,添加一个新的依赖项意味着要开很多、没完没了的会议,而且需要几个月的时间,而你却没有:只需在存储库中检查另一个标题……希望在你离开很久之前不会有任何影响。+1对于博客帖子链接,很高兴知道我不是唯一一个考虑这种编码风格的人。