我找到了几个讨论是否更好地将定义放入标题(例如here)的地方。但是,我找不到类似标题代码的#34;指南"。相关问题的答案提到了一些缺点:
但这就是全部吗?
将(所有)代码放入标题会有什么影响?
如果我使用标题保护,或者还有其他陷阱,我会保存吗?
我问这个的原因如下: 我认为最简单的方法是将所有代码放在头文件中。它是一个(相当小)的类和函数集合,应该被其他人包含在代码中。它应该用于不同的环境和不同的框架中。目前,我不明白为什么我应该构建我的代码(到lib),当使用它的人可以简单地包含她/他需要的头并编译它。然而,独立于这个项目,我总是有一种“不好的感觉”。将代码放入标题时,即使我上面提到的3个点都不重要。如果有人可以为我阐明这一点,那将是非常好的,所以我可以决定将代码放在更合理的基础上。
答案 0 :(得分:3)
有几个很棒的库实例主要在头文件中实现,例如: 标准库或提升。特别是,如果您想要分发模板库,那么您就没有其他选择。
这种方法的最坏后果是:
(1)见Klaus comment和inline description at cppreference.com(引用如下):
inline关键字的意图是作为优化器的指示器,该函数的内联替换优先于函数调用,即而不是执行调用CPU指令以将控制转移到函数体,执行函数体的副本而不生成调用。这避免了函数调用(复制参数和检索结果)所产生的额外开销,但它可能导致更大的可执行文件,因为函数的代码必须重复多次。 由于关键字内联的这种含义是非约束性的,编译器可以自由地使用内联替换任何未标记为内联的函数,并且可以自由地生成对内联标记的任何函数的函数调用 。这些选择不会改变有关上面列出的多个定义和共享静态的规则。
答案 1 :(得分:3)
从我的个人经验开始,我通常只在头文件中放置一行函数(getter和setter),因为所有其他函数体将使头文件难以一目了然地阅读和理解。 此外,如果您的项目需要多次包含头文件(并且您在其中编写了函数代码),那么您将有一个非常快速的编译时间,因为每次编译器都包含所有代码时都必须处理它们。