2 个或更多 TU 中内联函数的多个定义

multiple definitions of an inlined function in 2 or more TU

我正在阅读内联函数以及它们如何在不同的翻译单元中有多个定义,但这些定义必须相同。

所以我想的是,如果我在 header 文件中声明一个函数并在 2 个 cpp 文件中将其定义为内联,编译器将不会生气。

所以我尝试按照以下方式进行操作:

global.h

#ifndef DRAKOS_GLOBAL_H
#define DRAKOS_GLOBAL_H

#include <iostream>
void fct();

#endif //DRAKOS_GLOBAL_H

file1.cpp

#include "global.h"

inline void  fct()
{
    std::cout << "file1.cpp \n";
}

main.cpp

#include "global.h"

extern void fct();

int main()
{
    fct();
}

正在构建 ---> 错误:

undefined reference to `fct()'

好的,我在 google 环顾四周,我读到

It’s imperative that the function’s definition be placed in a header file, unless the function is used only in a single .cpp file.

到现在为止一切都清楚且合乎逻辑,但问题是,如果我将定义放在 header 文件中;每个 TU 都有相同的定义,我无法定义内联函数的两个版本,一个在 file1.cpp TU 中,另一个在 main.cpp TU 中。

所以问题 1:为什么他们说,对于一个内联函数,可以在不同的 TU 中有多个定义,但必须相同(就好像我把定义放在 header 中一样,它将是并且不能在 cpp 文件中做不同的事情)

问题 2:如果可以这样做并定义一个 inled 函数的多个定义(由于我这边的理解不正确)请给我一个简单的例子:)

提前致谢

由于规则 C++17 [dcl.inline]/6:

,此代码导致未定义的行为(无需诊断)

[...] If a function or variable with external linkage is declared inline in one translation unit, it shall be declared inline in all translation units in which it appears; no diagnostic is required.

您在 file1.cpp 中声明了 fct 内联,但在 main.cpp 中没有声明。

此外,您在 main.cpp 中没有对 fct 的任何定义。您 可以 复制并粘贴到 main.cpp(以及项目中的所有其他 .cpp):

inline void  fct()
{
    std::cout << "file1.cpp \n";
}

但那将是不好的做法,因为更容易意外更改其中一个函数或忘记 .cpp 文件。将它放在头文件中可以避免这个问题。