我试图证明你需要在所有使用它的TU中定义内联函数.但是,以下代码编译得很好(MSVS 2010):
英寸
inline void foo();
TEST.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是内联声明的,只在test.cpp中定义,但也在test2.cpp中使用.
如果我在main()中注释掉对foo的调用,我会得到预期的错误.
“void __cdecl foo(void)” (?foo@@YAXXZ) referenced in function “void
__cdecl x(void)” (?x@@YAXXZ) fatal error LNK1120: 1 unresolved externals
为什么让foo调用呢?在任何一种情况下,代码都不适用,对吧?
在inc.h中添加extern到foo的声明也会使它编译(无论在main中调用foo).
最佳答案 这在3.2 / 3中非常清楚:
……应在每个使用它的翻译单元中定义内联函数.
如果你没有在每个这样的TU中定义它,那么所有的赌注都是关闭的,编译器所做的任何事情都很好,包括在某些情况下似乎工作而在其他情况下无法工作.