gpt4 book ai didi

c++ - 为什么 C/C++ 中的函数体放在单独的源代码文件中而不是头文件中?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:03:17 27 4
gpt4 key购买 nike

例如,当我在 C++ 中定义一个类文件时,我总是将函数体与类定义一起放在类头文件 (.h) 中。源代码文件(.cpp)是带有 main() 函数的文件。现在这通常在 pro c++ 程序员中完成,还是他们遵循单独的头文件/源代码文件的约定。

至于原生 C,我确实注意到然后在 GCC 中完成(当然还有 Visual Studio for Windows 中的 header )。

这只是约定俗成吗?或者这是有原因的吗?

最佳答案

函数体被放入.cpp文件中实现如下:

  1. 让编译器只解析和编译它们一次,而不是强制它在头文件包含的任何地方一次又一次地编译它们。此外,在 header 实现的情况下,链接器稍后必须检测并消除到达不同目标文件的相同外部链接函数。

    许多现代编译器实现的头文件预编译工具可能会显着减少重复重新编译同一头文件所需的工作量浪费,但它们并不能完全消除这个问题。

  2. 对模块或库的 future 用户隐藏这些函数的实现。实现隐藏技术有助于强制执行某些编程规则,从而减少模块之间的寄生相互依赖性,从而导致代码更清晰,编译时间更快。

    我什至会说,即使用户可以访问该库的完整源代码(即没有任何东西对他们来说是真正“隐藏”的),应该通过头文件可见的内容和不应该可见的内容之间的清晰分离可见有利于库的自文档化属性(尽管这种分离在仅包含 header 的库中也是可以实现的)。

  3. 使某些函数对外界“不可见”(即内部链接,与您使用类方法的示例不直接相关)。

  4. 驻留在特定翻译单元中的非内联函数可以进行某些上下文相关的优化。例如,两个具有相同尾部的不同函数最终可能会“共享”实现这些相同尾部的机器代码。

    在头文件中声明为内联的函数在不同的翻译单元(即在不同的上下文中)被多次编译,并且稍后必须被链接器删除,这使得(如果可能的话)利用这样的优势变得更加困难优化机会。

  5. 我可能错过的其他原因。

关于c++ - 为什么 C/C++ 中的函数体放在单独的源代码文件中而不是头文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47878665/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com