c++ - 在头文件与 .cpp 文件中编码 C++ (moSTLy)

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

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

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

另外请注意,我们不是在这里编写 API(在这种情况下,像 pimpl idiom 之类的东西会通过隐藏实现为我们提供更大的灵 active ),我们正在编写在客户站点上运行的程序。

提前致谢,

最佳答案

在我的头顶:

优势:

  • 实现可见(更多的是一个弱点,但取决于具体情况)
  • 无需导出到库
  • 编译器有更好的机会优化部分代码

弱点:

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

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

https://stackoverflow.com/questions/10103111/

相关文章:

scala - 更新后 Unresolved 依赖 SBT 0.13.0

r - R中 "Error: package ' ____ _' was built before

xcode - 构建静态库

build - Gitlab-CI:gitlab ci trigger build 仅用于合并请求

java - 在 Java : Cannot find symbol 中使用 Kotlin 类

c++ - 用于创建合并/将库的所有源文件合并为 C/C++ 的工具?

c++ - 使用 Xcode 在 Mac 上构建 Boost

build - 链接大型库时是否可以加快 Rust 编译?

java - Intellij 在 jar 文件中包含 src 文件

c++ - 使用 C++ 构建错误 - ‘find_if’ 不是 ‘std' 的成员