2

显然,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

4

2 回答 2

3

it was a bug in visual studio 2005, it was fixed in vs 2008

于 2010-01-16T16:40:56.403 回答
1

It looks like a bug to me. Maybe that's why it works in VS2008. (Incidentally, Microsoft, this is a good reason for breaking the IDE/compiler dependency in Visual Studio.)

As for a workaround, try explicitly adding inline, or not inlining wait_what.

于 2010-01-16T16:40:32.350 回答