【问题标题】:Why create a .cpp file when I could declare and define it all in the header file?当我可以在头文件中声明和定义它时,为什么要创建一个 .cpp 文件?
【发布时间】:2020-08-27 06:10:49
【问题描述】:

我理解并非常欣赏分离头文件(.h、.hpp)和源文件(.cpp)的做法。

但是,许多简单的类可以完全在头文件本身中表示。我可以在类中定义一些方法,在类下面定义其他方法(例如模板方法、内联方法)。

当我可以在头文件中声明定义整个类时,创建 .cpp 文件有什么好处? (我什至需要吗?)

【问题讨论】:

  • 编译速度可能更快。在他们的 cpp 文件中,实现只编译一次,而不是每次包含头文件时。
  • 对于小类,没有理由将定义分离到 .cpp 文件中。我觉得 C++ 项目无论如何都很难导航,而不必将每个小类分成两个文件。无论如何,这都是基于意见的。

标签: c++ oop header-files


【解决方案1】:

如果您在头文件中有代码,则每当头文件更改时,包含该头文件的客户端代码也必须重新编译。使用单独的 cpp 文件,只需要重新链接。在大型项目中,差异可能以小时为单位。

如果您构建一个库并仅分发头文件,则将代码放在 .cpp 文件中会对用户隐藏它。有时这是必要的。

通过头文件,您可以保持客户端代码不变并替换库(例如在调试和发布之间,或者在常规和调用跟踪版本之间)。这对于调试或调查问题很有用。

将头文件放在一边可以使文件更小,更易于类用户理解。您可以在 .cpp 文件中隐藏复杂性。

【讨论】:

    【解决方案2】:

    如前所述,编译时间是拥有独立翻译单元的原因之一。特别是如果您有许多内核并行化可以显着减少编译时间。另一个原因是非模板类和函数以及头文件中的变量在包含在不同的翻译单元中时会导致重复符号。一旦你使用虚函数,内联就不是可行的选择。

    您可以使用模板来避免重复符号问题,但除了编译时间更长之外,这还会导致链接时间更长,因为链接器必须折叠模板实例(请参阅https://gcc.gnu.org/onlinedocs/gcc/Template-Instantiation.html)。尽管如此,STL 和许多其他仅包含头文件的库正是这样做的。

    【讨论】:

      【解决方案3】:

      没有什么能阻止您将所有内容都放在头文件中。但是不这样做会对项目本身产生各种影响,在某些情况下会提高可读性并积极提高编译速度,因为没有编译依赖于您刚刚更改的文件的所有内容。

      通常,对于小班或很少更改的班级,它几乎没有任何影响。

      我会注意到,随着 > c++20 和模块的包含,事情会慢慢发生变化,我们将开始看到更多纯粹写在头文件中的代码(如果它们仍然被这样调用的话)。

      不过,这个问题太基于意见,无法给出好的答案。

      【讨论】:

        【解决方案4】:

        编译速度。使实现远离定义使您可以灵活地修改小代码,而无需重新编译包含该标头的所有源。这是 makefile 的工作方式,它检测先决条件的变化。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-12-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-24
          • 1970-01-01
          相关资源
          最近更新 更多