删除内联函数调用会导致无法解析的外部符号错误

时间:2014-08-05 15:23:51

标签: c++ visual-studio inline

我试图证明你需要在使用它的所有TU中定义inline函数。但是,以下代码编译得很好(MSVS 2010):

inc.h

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已声明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的调用。)

1 个答案:

答案 0 :(得分:2)

3.2 / 3中非常清楚:

...An inline function shall be defined in every translation unit in which it is used.

如果你没有在每个这样的TU中定义它,那么所有的赌注都是关闭的,并且任何编译器都可以正常工作,包括在某些情况下似乎工作并且无法在其他情况下工作。