当我把所有的代码放在标题时,我要考虑什么?

What do I have to consider when putting all code in the header?

本文关键字:我要 什么 标题 代码      更新时间:2023-10-16

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

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

但这就是全部吗?

将(所有)代码放在头文件中会产生什么后果?

我保存如果我使用头保护,还是有其他陷阱?

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

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

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

我认为,这种方法的最坏后果是:

  • 爆炸编译时间:每编辑你的代码,你将不得不重建所有文件,包括头;这是一个非常严重的问题,除非你在开发时一直使用"。h"/"。cpp"方法,然后在
  • 的末尾重新排列你的代码到头文件中。
  • 二进制代码膨胀:你所有的函数都必须声明为"内联",所以你可能有一个性能改进,但你可能(1)也有二进制代码的复制每次你使用一个函数

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

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