【发布时间】:2019-06-11 21:56:17
【问题描述】:
我正在阅读有关内联函数以及它们如何在不同的翻译单元中具有多个定义但这些定义必须相同的内容。
所以我的想法是,如果我在头文件中声明一个函数并在 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();
}
正在构建 ---> 错误:
对`fct()'的未定义引用
好的,我在 google 上看了看,我读到了
函数的定义必须放在头文件中 文件,除非该函数仅在单个 .cpp 文件中使用。
到现在为止一切都清楚和合乎逻辑,但问题是,如果我把定义放在头文件中;每个 TU 都将具有相同的定义,我将无法定义两个版本的内联函数,比如一个在 file1.cpp TU 中,另一个在 main.cpp TU 中。
所以问题 1:为什么他们说,对于内联函数,可以在不同的 TU 中有多个定义但必须相同(就好像我将定义放在标题中一样,并且在 cpp 中不能做不同文件)
问题 2:如果可以这样做并定义 inled 函数的多个定义(由于我的理解缺失),请给我一个简单的例子 :)
提前致谢
【问题讨论】:
-
你为什么有这个内联?它只会在
file1.cpp中定义。如果你打算让它内联,把它放在global.h -
这是一个测试问题。正如我所说,下面的代码有一个错误,要修改它,我必须在标题中定义函数。最大的问题是如何对内联函数进行多重定义
-
将 file1.cpp 名称更改为 global.cpp,或者在 main 中包含 file1.cpp。
-
您的 main.cpp 没有定义 fct()。
extern void fct()无效,因为您已经包含 global.h 并且没有为 fct() 提供正文
标签: c++ inline-functions