当我可以在头文件中声明和定义所有文件时,为什么要创建一个.cpp文件?

Why create a .cpp file when I could declare and define it all in the header file?

本文关键字:文件 创建 为什么 cpp 一个 我可以 声明 定义      更新时间:2023-10-16

我理解并非常感谢分离标头(.h,.hpp(和源文件(.cpp(的做法。

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

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

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

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

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

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

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

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

没有什么能阻止你把所有东西都放在头文件中。但是,否则会对项目本身产生各种影响,在某些情况下,由于没有编译依赖于您刚刚更改的文件的所有内容,因此可以提高可读性并积极提高编译速度。

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

我要指出的是,随着> c++20 和模块的包含,事情会慢慢改变,我们将开始看到更多纯粹写在头文件中的代码(如果它们仍然会这样调用(。

尽管如此,这个问题太基于意见了,无法得到很好的答案。

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