繁体   English   中英

在 header 文件与 cpp 文件中编码 C++(大部分)

[英]Coding C++ (mostly) in header files vs .cpp files

多年来,我一直以标准方式对 C++ 进行编码,在 header files.hpp 中使用 class 声明,在 source.cpp 文件中使用 function 定义。 最近我搬到了一家新公司,那里的代码(似乎受 boost 编码风格的影响)完全编码在 .hpp 文件中,其中包含一个 short.cpp 文件,以包含 header 文件并创建对象/程序二进制文件。

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

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

另请注意,我们不是在此处编写 API(在这种情况下,像 pimpl 习语这样的东西会通过隐藏实现为我们提供更大的灵活性),我们正在编写在客户站点上运行的程序。

提前致谢,

在我的头顶上:

优势:

  • 实现可见(更多的是弱点,但视情况而定)
  • 无需导出到库
  • 编译器有更好的机会优化某些代码

弱点:

  • 实施可见
  • 构建时间较慢
  • 臃肿的 header 文件
  • 实现中的更改需要完全重建,在实现文件中实现不需要(仅编译该特定文件或库)
  • 在循环依赖的情况下,您使用前向声明并且只在实现文件中包含完整类型。 如果你只有一个 header,这就不可能了。

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

Header only 库往往使构建系统更容易,通常您需要较少关心依赖项。

另一方面,将代码移动到实现文件可以更轻松地控制模块边界和创建可交换的二进制模块,从而改进增量构建。 成本更多的是“管家”。 我的直觉是更喜欢实现文件,并且有一些数据点支持我,例如拟议的 Boost Networking Library 作者的这篇博文。

公共库是一回事,代码的一般可重用性是另一回事。 如果你想使用你在另一个项目中编写的一些代码,你可能不得不复制'n'粘贴大量代码,然后维护单独的代码库。 编译时间会变长,因为程序将是一个大的编译单元,而不是许多 cpp/h 文件,只有那些包含修改过的 header 文件的文件才会被重新编译。 例如,我目前正在处理的应用程序的完整构建需要 7 分钟。 如果变化不严重,重新编译大约需要十五秒。 最后,代码的可读性可能会降低。 Header 文件让您快速浏览 class 的创建目的以及如何使用它。 如果类是就地编写的,您将不得不不必要地挖掘源代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM