我试图证明你需要在使用它的所有TU中定义inline
函数。但是,以下代码编译得很好(MSVS 2010):
inline void foo();
#include "inc.h"
void x();
int main()
{
foo(); // <--- compilation fails if I remove this call
x();
return 0;
}
void foo()
{
}
#include "inc.h"
void x()
{
foo();
}
请注意,函数调用是为了防止优化。虽然foo
已声明inline
并且仅在test.cpp
中定义,但也在test2.cpp
中使用,但这会进行编译。
如果我在foo
中注释了main()
的来电,我会收到预期的错误。
“void __cdecl foo(void)”(?foo @@ YAXXZ)在函数中引用“void __cdecl x(void)“(?x @@ YAXXZ)致命错误LNK1120:1个未解析的外部
为什么foo
电话有问题?在任何一种情况下代码都不行,对吗?
在extern
中将foo
添加到inc.h
的声明也会使其编译(无论foo
中对main
的调用。)
答案 0 :(得分:2)
3.2 / 3中非常清楚:
...An inline function shall be defined in every translation unit in which it is used.
如果你没有在每个这样的TU中定义它,那么所有的赌注都是关闭的,并且任何编译器都可以正常工作,包括在某些情况下似乎工作并且无法在其他情况下工作。