提问人:Luchian Grigore 提问时间:8/5/2014 更新时间:8/5/2014 访问量:851
删除内联函数调用会导致无法解决的外部符号错误
Removing inline function call results in unresolved external symbol error
问:
我试图证明您需要在所有使用它的 TU 中为函数定义。但是,以下代码编译良好 (MSVS 2010):inline
公司
inline void foo();
测试.cpp
#include "inc.h"
void x();
int main()
{
foo(); // <--- compilation fails if I remove this call
x();
return 0;
}
void foo()
{
}
测试2.cpp
#include "inc.h"
void x()
{
foo();
}
请注意,函数调用是为了防止优化。这编译,虽然在 中声明并仅在 中定义,但也在 中使用。foo
inline
test.cpp
test2.cpp
如果我注释掉对 in 的调用,我会得到预期的错误。foo
main()
函数“void __cdecl foo(void)” (?foo@@YAXXZ) 引用 __cdecl x(void)“ (?x@@YAXXZ) 致命错误 LNK1120:1 个未解决的外部问题
为什么在那里打电话很重要?代码在任何一种情况下都不应该起作用,对吧?foo
添加到 的声明 in 也会使其编译(无论对 in 的调用如何)。extern
foo
inc.h
foo
main
答:
2赞
Mark B
8/5/2014
#1
这在 3.2/3 中非常清楚:
...An inline function shall be defined in every translation unit in which it is used.
如果你没有在每个这样的 TU 中定义它,那么所有的赌注都是失败的,编译器所做的任何事情都很好,包括在某些情况下似乎可以工作,而在其他情况下却无法工作。
下一个:如何使每帧分支优化友好?
评论
An inline function shall be defined in every translation unit in which it is odr-used and shall have exactly the same definition in every case
foo