在标头文件中实现小型功能,包括在同一项目中的两个不同文件中实现

问题描述

learncpp.com中关于是否在头文件中实现功能的引文:

  1. 对于仅在一个文件中通常无法重用的类,请在使用它们的单个.cpp文件中直接定义它们。
  2. 对于在多个文件中使用的类或供一般重用的类,请在与该类同名的.h文件中定义它们。
  3. 可以在类内部定义私有成员函数(琐碎的构造函数或析构函数,访问函数等)。
  4. 不重要的成员函数应在与类同名的.cpp文件中定义。

假设我遵循#3的建议,并且在my_class::f文件中实现了一些小的方法my_class.h,但是我将更大的方法保留在my_class.cpp中。如果在同一项目的两个不同的my_class.h文件中包含.cpp,则链接器将看到my_class::f的两个(相同)定义。 (这不是由标题保护程序解决的。)我知道有些链接器足够聪明,可以忍受这一点(尽管我听说它会花费额外的时间)。我的问题是:

您认为他们建议#3是因为在一个项目中两次包含相同的.h文件并不常见,还是因为可以依靠链接程序来忽略重复的定义,并且这样做不会浪费太多时间?

解决方法

建议3中有文字

私有成员函数(琐碎的构造函数或析构函数,访问 函数等)。可以在类内部定义

在类中定义的成员函数是内联函数。因此,将头文件包含在多个编译单元中是没有问题的。

,

我了解某些链接器足够聪明,可以忍受这一点

所有符合标准的链接器都可以接受内联函数的多个相同定义。

可以依靠链接器来忽略重复的定义

是的

会不会浪费太多时间?

我希望链接器所浪费的时间不会很长。

但是,通常必须针对使用它们的每个翻译单元来编译内联函数。如果它是一个特别复杂的函数,那么编译器(而不是链接器)可能会浪费大量时间。这就是本教程建议仅内联定义琐碎函数的部分原因。

遵循(暗示的)建议(内嵌定义非平凡函数)的另一个原因是非平凡函数会吸引更改,并且对头文件的修改会随着对包含以下内容的文件的更改而传播:这些标题。非内联函数可以将重新编译时间减少到整个编译时间的一小部分,这是因为不需要重复编译,并且在更改时也不会导致其他翻译单元被编译。