在头文件和.cpp文件中编码C ++(主要是)

时间:2012-04-11 09:17:41

标签: c++ build

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

它让我思考 - 在头文件中编写代码的优点/缺点是什么,而不是编写.hpp&每个对象的.cpp文件?这假设我们的项目不创建公共库,然后将它们链接到程序二进制文件中,而是每个程序二进制文件都是根据头文件(和一个源.cpp文件)的总和构建的。这是C ++的新趋势吗?

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

另请注意,我们不是在这里编写API(在这种情况下,类似于pimpl习惯用法会通过隐藏实现来提供更多灵活性),我们正在编写程序以在客户站点上运行。

提前致谢,

3 个答案:

答案 0 :(得分:10)

脱离我的头顶:

优势:

  • 实施可见(更多的弱点,但取决于具体情况)
  • 无需导出到库
  • 编译器更好地优化某些代码

弱点:

  • 实施可见
  • 构建时间较慢
  • 膨胀的头文件
  • 实现中的更改需要完全重建,实现文件中的实现不会(仅编译该特定文件或库)
  • 如果是循环依赖,则使用forward-declarations并且仅在实现文件中包含完整类型。如果你只拥有一个标题,那就不可能了。

我确定还有其他人,如果我能想到的话,我会编辑。

答案 1 :(得分:1)

仅限标头库往往使构建系统更容易,通常您需要更少关注依赖项。

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

答案 2 :(得分:0)

公共库是一回事,代码的一般可重用性是另一回事。如果你想使用你在另一个项目中编写的一些代码,你可能需要复制'n'来填充大量的代码,然后维护单独的代码库。编译时间会变长,因为程序将是一个大的编译单元,而不是许多cpp / h文件,其中只有那些包含修改后的头文件的文件将被重新编译。例如,我正在进行的完整构建的应用程序需要7分钟。如果更改不严重,重新编译需要大约15秒。最后,代码可能往往不太可读。头文件使您可以快速浏览创建类的内容以及如何使用它。如果类是在内部编写的,则必须不必要地挖掘源代码。