تنتج الفصول المحلية داخل الوظيفة غير المدمجة LNK2005 مع MSVC2005

StackOverflow https://stackoverflow.com/questions/2078087

سؤال

على ما يبدو ، فشل 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 ، هذا سبب وجيه لكسر الاعتماد على IDE/برنامج التحويل البرمجي في Visual Studio.)

أما بالنسبة للحل البديل ، فحاول الإضافة بشكل صريح inline, ، أو لا تضم wait_what.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top