使用内联函数 c++ 的未定义引用

Undefined reference with inline function c++

本文关键字:未定义 引用 c++ 函数      更新时间:2023-10-16

我有两个 cpp 文件:

F1.cpp

using namespace std;
int i;
void Modify();
int main()
{
i=1;
cout << "i main 1 = " << i << endl;
Modify();
cout << "i main 2 = " << i << endl;
return 0;
}

F2.cpp

using namespace std;
extern int i;
inline void Modify()
{
i=99;
cout << "i modify = " << i << endl;
}

当我启动可执行文件时,出现此错误:F1.o:在函数主中:F1.cpp:(.text+0x4a(:未定义对"修改(("的引用 collect2:错误:ld 返回 1 个退出状态

我不明白为什么会发生这种情况,因为内联函数的要点是在调用函数时复制粘贴代码。所以当我在我的主方法中调用 Modify(( 时,我会认为它会将 Modify(( 函数的代码粘贴在那里,因此我不明白为什么会有未定义的引用......

请帮忙!

内联函数的定义应存在于使用它的每个编译单元中。

来自 C++ 17 标准(10.1.6 内联说明符(

2

带有内联的函数声明(11.3.5、12.2.1、14.3( 说明符声明内联函数。内联说明符指示 到函数体的内联替换的实现 调用点优先于通常的函数调用 机制。执行此内联操作不需要实现 在呼叫点进行替换;但是,即使这种内联 省略替换,内联函数的其他规则 本节中规定的仍应得到尊重。

6 每次翻译中都应定义内联函数或变量 使用ODR的单位,应具有完全相同的单位 每种情况下的定义

void Modify();

这一行实际上是一个函数声明。但是,您尚未提供函数的实现(即函数定义(。您已在 F2 中定义了一个内联函数.cpp但这在 F1.cpp 中不可见。

通常的做法是在头文件中定义内联函数。它们通常是非常短的函数,大小为一两行。发生的情况是,在编译期间,编译器会将内联函数的内容复制到使用它的任何位置。但是,以内联方式声明函数并不能保证会发生这种情况。编译器可以自由选择扩展部分、全部或不扩展内联函数。

您可能会发现C++常见问题解答的这一部分很有趣:

注意:函数的定义(介于 的 {...}(放置在头文件中,除非使用该函数 仅在单个.cpp文件中。特别是,如果您将内联 函数的定义到一个.cpp文件中,你从其他一些文件中调用它 .cpp文件中,你将从链接器收到"未解析的外部"错误。

在您的 F1.cpp 文件中,从未实际定义过Modify()。这也是返回的错误所指的。