C++ 在头文件中实现小函数,包括在同一项目中的两个不同文件中

C++ 在头文件中实现小函数,包括在同一项目中的两个不同文件中,c++,linker,header-files,one-definition-rule,C++,Linker,Header Files,One Definition Rule,关于是否在头文件中实现函数的引用: 对于仅在一个文件中使用但通常不可重用的类,请直接在使用它们的单个.cpp文件中定义它们 对于在多个文件中使用的类或用于一般重用的类,请在与该类同名的.h文件中定义它们 可以在类内部定义普通成员函数(普通构造函数或析构函数、访问函数等) 非平凡成员函数应在与类同名的.cpp文件中定义 假设我遵循#3的建议,在my_class.h文件中实现了一些小方法my_class::f,但我将较大的方法留在my_class.cpp中实现。如果在同一项目中的两个不同的.cpp文

关于是否在头文件中实现函数的引用:

  • 对于仅在一个文件中使用但通常不可重用的类,请直接在使用它们的单个.cpp文件中定义它们
  • 对于在多个文件中使用的类或用于一般重用的类,请在与该类同名的.h文件中定义它们
  • 可以在类内部定义普通成员函数(普通构造函数或析构函数、访问函数等)
  • 非平凡成员函数应在与类同名的.cpp文件中定义
  • 假设我遵循#3的建议,在
    my_class.h
    文件中实现了一些小方法
    my_class::f
    ,但我将较大的方法留在
    my_class.cpp
    中实现。如果在同一项目中的两个不同的
    .cpp
    文件中包含
    my_class.h
    ,则链接器将看到
    my_class::f
    的两个(相同)定义。(这不是通过标题保护来解决的。)我知道有些链接器足够聪明,可以容忍这一点(尽管我听说这会花费额外的时间)。我的问题是:

    您认为他们推荐#3是因为在一个项目中两次包含相同的.h文件是很少见的,还是因为链接器可以忽略重复的定义,并且不会浪费太多时间

    建议#3中写有

    普通成员函数(普通构造函数或析构函数、访问 函数等。)可以在类内部定义

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

    在建议3中,有一个

    普通成员函数(普通构造函数或析构函数、访问 函数等。)可以在类内部定义

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

    我知道有些链接器足够聪明,可以容忍这种情况

    所有符合标准的链接器都允许内联函数的多个相同定义

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

    这样做不会浪费太多时间

    我不认为链接器浪费的时间很长

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

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

    我知道有些链接器足够聪明,可以容忍这种情况

    所有符合标准的链接器都允许内联函数的多个相同定义

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

    这样做不会浪费太多时间

    我不认为链接器浪费的时间很长

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


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

    您需要使函数避免重新定义。建议使用C++代码文件。这将区分C语言头文件,即代码> > H/COD>,从C++头文件中区分出来。C编译器不能编译C++头文件,需要做的功能是避免重新定义。建议使用C++代码文件。这将区分C语言头文件,即代码> > H/COD>,从C++头文件中区分出来。C编译器不能编译C++头文件。教程中会建议在源文件中定义大多数代码是很奇怪的。标准库有超过一百万行模板化的仅头代码。编译器可能会从函数定义中获益,即使有50行代码可用,但仍然部分内联。@Janshultke编写模板时,很少有机会在单独的翻译单元中定义函数。但是,对于非模板函数,非内联函数可以通过将重新编译时间缩短到整个编译时间的一小部分来实现。奇怪的是,教程建议在源文件中定义大多数代码。标准库有超过一百万行模板化的仅头代码。编译器可能会从函数定义中获益,即使有50行代码可用,但仍然部分内联。@Janshultke编写模板时,很少有机会在单独的翻译单元中定义函数。与非te