c – 删除内联函数调用会导致未解决的外部符号错误

我试图证明你需要在所有使用它的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中定义它,那么所有的赌注都是关闭的,编译器所做的任何事情都很好,包括在某些情况下似乎工作而在其他情况下无法工作.

点赞