声明:“内联函数必须在调用之前定义。”
这个说法正确吗?
[编辑]
问题最初是德语:
Inline-Funktionen müssen vor ihrem Aufruf definiert sein。
也许它可以帮助任何人......
声明:“内联函数必须在调用之前定义。”
这个说法正确吗?
[编辑]
问题最初是德语:
Inline-Funktionen müssen vor ihrem Aufruf definiert sein。
也许它可以帮助任何人......
是的,它是正确的,但只是部分正确。它可能正确地重新构建如下:
“必须在调用它们的每个翻译单元(但不一定在之前)中定义内联函数。”
C11++ 标准:§7.1.2.4
内联函数应在使用它的每个翻译单元中定义,并且在每种情况下都应具有完全相同的定义。[注意:对内联函数的调用可能会在其定义出现在翻译单元中之前遇到。——尾注]
为什么会有这个理由?
当您基本上内联声明函数时,您是在告诉编译器(如果可能)将调用函数的代码替换为调用函数的函数的内容。这个想法是函数体可能很小,调用函数比函数体本身的开销更大。
为了能够做到这一点,编译器需要在编译代码时查看定义,即调用函数的位置。通常,这是通过在带有说明符的头文件中添加函数的定义,inline
然后在要调用函数的每个 cpp 文件中包含头文件来完成的。
号C++11 草案 n3242比 7.1.2 第 4 小节中的早期规范更清楚;
内联函数应在使用它的每个翻译单元中定义,并且在每种情况下都应具有完全相同的定义(3.2)。[ 注意:在其定义出现在翻译单元之前,可能会遇到对内联函数的调用。——尾注]
该语句没有意义:不再调用内联的函数,代码只是存在于当前函数中(它已被“内联”)。所以不,我会说这是不正确的。