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 文件。将它放在头文件中可以避免这个问题。
我正在阅读内联函数以及它们如何在不同的翻译单元中有多个定义,但这些定义必须相同。
所以我想的是,如果我在 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 文件。将它放在头文件中可以避免这个问题。