显然,MSVC2005 未能内联导致 LNK2005 的本地类的成员函数。
编译以下内容时遇到此 LNK2005 错误:
common.h
内容:
inline void wait_what()
{
struct wtf
{
void ffffuuu() {}
} local;
}
foo.cpp
内容:
#include "common.h"
void foo()
{
wait_what();
}
bar.cpp
内容:
#include "common.h"
void bar()
{
wait_what();
}
LNK2005.cpp内容:
// forward declarations
void foo();
void bar();
int main()
{
foo();
bar();
return 0;
}
错误信息是:
error LNK2005: "public void __thiscall `void__cdecl wait_what(void)'::`2'::wtf::ffffuuu(void)" (?ffffuuu@wtf?1??wait_what@@YAXXZ@QAEXXZ) already defined in bar.obj
关于本地课程,ISO IEC 14882-2003 说:
9.8 本地类声明
类可以在函数定义中定义;这样的类称为本地类。本地类的名称在其封闭范围内是本地的。本地类在封闭作用域的范围内,并且对函数外部的名称具有与封闭函数相同的访问权限。本地类中的声明只能使用封闭范围内的类型名称、静态变量、外部变量和函数以及枚举数。
封闭函数对本地类的成员没有特殊的访问权限;它遵守通常的访问规则(第 11 条)。本地类的成员函数应在其类定义中定义,如果它们被定义的话。
我错过了什么?
对我来说,它看起来像是一个编译器错误。GCC 和 MSVC2008 编译它就好了。但是,我想知道他们是否真的会内联调用,或者只是在链接阶段丢弃两个符号之一。作为一个有趣的注释,您可以注意到甚至没有调用这个本地类成员函数。
我想知道 MSVC2005 是否有解决方法。我试图在 MSDN 中搜索这个典型问题,但没有取得多大成功:我什至无法找到编译器的已知错误列表。
附件:LNK2005.zip