请考虑以下代码:
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)。 我可以用两种方式解决它。
假设我想将此函数内联,为什么我必须在声明中添加extern?
我使用VS2008。
感谢。
答案 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
的定义放入头文件中?如果编译器没有看到它,它就无法内联它。