将所有代码放入标题时我需要考虑什么?

时间:2015-06-11 10:06:21

标签: c++ compilation header code-separation

我找到了几个讨论是否更好地将定义放入标题(例如here)的地方。但是,我找不到类似标题代码的#34;指南"。相关问题的答案提到了一些缺点:

  • 增加编译时间
  • 不可能有循环依赖
  • 没有(简单)全球对象

但这就是全部吗?

将(所有)代码放入标题会有什么影响?

如果我使用标题保护,或者还有其他陷阱,我会保存吗?

我问这个的原因如下: 我认为最简单的方法是将所有代码放在头文件中。它是一个(相当小)的类和函数集合,应该被其他人包含在代码中。它应该用于不同的环境和不同的框架中。目前,我不明白为什么我应该构建我的代码(到lib),当使用它的人可以简单地包含她/他需要的头并编译它。然而,独立于这个项目,我总是有一种“不好的感觉”。将代码放入标题时,即使我上面提到的3个点都不重要。如果有人可以为我阐明这一点,那将是非常好的,所以我可以决定将代码放在更合理的基础上。

2 个答案:

答案 0 :(得分:3)

有几个很棒的库实例主要在头文件中实现,例如: 标准库提升。特别是,如果您想要分发模板库,那么您就没有其他选择。

这种方法的最坏后果是:

  • 爆炸编译时间:您对代码进行的每次编辑,都必须重建包含该标题的所有文件;这是一个非常严重的问题,除非你继续使用" .h" /" .cpp"接近开发,然后将代码重新排列到最后的标题中
  • 二进制代码膨胀:您的所有功能都必须声明"内联",因此您可能会有性能提升,但可能(1 )每次使用函数时都会复制二进制代码

(1)见Klaus commentinline description at cppreference.com(引用如下):

  

inline关键字的意图是作为优化器的指示器,该函数的内联替换优先于函数调用,即而不是执行调用CPU指令以将控制转移到函数体,执行函数体的副本而不生成调用。这避免了函数调用(复制参数和检索结果)所产生的额外开销,但它可能导致更大的可执行文件,因为函数的代码必须重复多次。   由于关键字内联的这种含义是非约束性的,编译器可以自由地使用内联替换任何未标记为内联的函数,并且可以自由地生成对内联标记的任何函数的函数调用 。这些选择不会改变有关上面列出的多个定义和共享静态的规则。

答案 1 :(得分:3)

从我的个人经验开始,我通常只在头文件中放置一行函数(getter和setter),因为所有其他函数体将使头文件难以一目了然地阅读和理解。 此外,如果您的项目需要多次包含头文件(并且您在其中编写了函数代码),那么您将有一个非常快速的编译时间,因为每次编译器都包含所有代码时都必须处理它们。