内联函数的未解析符号

时间:2018-01-07 16:24:19

标签: c++ winapi inline extern

请考虑以下代码:

Test2.h:

#ifndef ABCD
#define ABCD

#ifdef __cplusplus
extern "C" {
#endif

void Foo();

#ifdef __cplusplus
}
#endif
#endif // ABCD

测试2.cpp

#include "StdAfx.h"
#include "Test2.h"

inline void Foo()
{
}

Test.cpp的:

#include "stdafx.h"
#include "Test2.h"

int _tmain(int argc, _TCHAR* argv[])
{
    Foo();
    return 0;
}

编译此代码时,我收到LNK2019错误(未解析的外部符号_Foo)。 我可以用两种方式解决它。

  1. 删除内联关键字。
  2. 将extern添加到函数声明中。
  3. 假设我想将此函数内联,为什么我必须在声明中添加extern?

    我使用VS2008。

    感谢。

1 个答案:

答案 0 :(得分:2)

C ++ 11标准第3.2.3段:

  

内联函数应在每个使用它的翻译单元中定义。

您有2个翻译单元,首先来自Test2.cpp ...:

// ... code expanded from including "StdAfx.h"

extern "C" { void Foo(); }

inline void Foo() { }

...第二次来自Test.cpp

// ... code expanded from including "StdAfx.h"

extern "C" { void Foo(); }

int _tmain(int argc, _TCHAR* argv[])
{
    Foo();
    return 0;
}

在第二个TU中,缺少Foo的定义。

为什么不简单地将Foo的定义放入头文件中?如果编译器没有看到它,它就无法内联它。