2

我发现几个地方讨论了是否将定义放在标题中更好(例如这里)。但是,我找不到类似“仅标头代码指南”之类的东西。链接问题的答案提到了一些缺点:

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

但仅此而已吗?

将(所有)代码放在标题中的后果是什么?

如果我使用头球后卫,我会省钱吗,还是有其他陷阱?

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

4

2 回答 2

3

有几个主要在头文件中实现的出色库的示例,例如std 库boost。特别是,如果你想分发一个模板库,你别无选择。

恕我直言,这种方法的最坏后果是:

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

(1) 请参阅cppreference.com 上的Klaus 评论和内联描述(引用如下):

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

于 2015-06-11T10:09:08.220 回答
3

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

于 2015-06-11T10:18:18.313 回答