تنتج الفصول المحلية داخل الوظيفة غير المدمجة LNK2005 مع MSVC2005
-
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 ، هذا سبب وجيه لكسر الاعتماد على IDE/برنامج التحويل البرمجي في Visual Studio.)
أما بالنسبة للحل البديل ، فحاول الإضافة بشكل صريح inline
, ، أو لا تضم wait_what
.