内联非成员函数内的本地类使用 MSVC2005 生成 LNK2005
-
21-09-2019 - |
题
显然,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
解决方案
这是 Visual Studio 2005 中的一个错误,在 vs 2008 中已修复
其他提示
对我来说这看起来像是一个错误。也许这就是它在 VS2008 中工作的原因。(顺便说一下,Microsoft,这是打破 Visual Studio 中 IDE/编译器依赖关系的一个很好的理由。)
至于解决方法,请尝试显式添加 inline
, ,或者不内联 wait_what
.
不隶属于 StackOverflow