تحذير C4099:اسم النوع الذي شوهد لأول مرة باستخدام "الفئة" الذي تمت مشاهدته الآن باستخدام "البنية" (MS VS 2k8)

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

  •  19-08-2019
  •  | 
  •  

سؤال

هل هذا التحذير يدعو للقلق؟لقد قرأت أنه يمكن أن يسبب سلوكا خاطئا؟

إنه مثال أحاول تجميعه، هل يمكن لأحد أن يشرح لي لماذا يعلن المؤلف عن الكائن كفئة ولكن بعد ذلك يقوم بتعريفه إلى بنية؟هل من الطبيعي تمامًا القيام بذلك إذا كان الفصل كذلك جراب?

شكرًا.

هل كانت مفيدة؟

المحلول

ويظهر هذا التحذير عندما يكون لديك تعريف نوع واحد يتعارض آخر (واحد يقول "الطبقة"، ويقول الآخر "البنية"). ونظرا لسيادة تعريف واحد، كل الإعلانات عدا على الأكثر يجب على المرء أن يكون الإعلانات إلى الأمام. سوف التحذير تشير عموما أن إعلان الأمام من نوع خاطئ وعادة ما يكون الخطأ المطبعي بسيطة وينبغي أن تكون ثابتة. في هذه الحالة يجب أن يكون هناك أي آثار جانبية، ولكن هل حقا يجب إصلاحه.

ويمكن أن يكون هناك، ولكن بعض الأمور سيئة جدا يحدث إذا كان لديك اشتباكات نوع اسم (ربما تسبب باستخدام "باستخدام مساحة الاسم" بنود أو تلوث مساحة الاسم العالمي). هذه التحذيرات يمكن أن تشير إلى أنك خلط رؤوس اثنين من مكتبات مختلفة وأسماء نوع يكون الاشتباكات. التعليمات البرمجية المترجمة في ظل هذه الظروف يمكن أن تفعل بعض الأشياء غير متوقعة للغاية.

ونصيحتي - نفهم لماذا هذا التحذير قد ظهرت وإصلاحه. إذا كان التحذير في منتج طرف ثالث، يصرون على أنهم إصلاحه.

نصائح أخرى

وفقط لجلب التعليق بواسطة MSalters ضد <لأ href = "https://stackoverflow.com/questions/468486/warning-c4099-type-name-first-seen-using-class-now-seen-using- البنية MS-مقابل # 468545 "> هذا آخر أعلاه إلى المستوى الأعلى. لقد كان العديد من الصعب العثور على أخطاء رابط نتيجة VC باستخدام 'الفئة' أو الكلمة "البنية" في تغيير اسم لها من الأسماء.

إذا كنت لا تتوقع أن تكون المشكلة التي يمكن أن تترك خدش رأسك لساعات!

وأناقش هذا التحذير في العمق في بلدي بلوق نشر "<لأ href =" http://alfps.wordpress.com/2010/06/22/cppx-is-c4099-really-a-sillywarning-disabling-msvc -sillywarnings / "يختلط =" نوفولو noreferrer "> هل C4099 حقا sillywarning؟" . استنتاجي هو أن من الأفضل إيقاف تشغيله. :-) حسنا، على الأقل بالنسبة لي.

وريتشارد كوردن هو الصحيح - هناك سبب MS ديه هذا التحذير. لمترجم MS، تشمل زينت (المشوهة) الأسماء التي <م> يتم استخدام الطبقة مفتاح (struct أو class) لتعريف نوع. إذا دالة التي تأخذ بعض وجوه كحجة أو إرجاع هذا الكائن تتم الإشارة في مكان ما عند الطبقة المفتاح الخطأ غير مرئية، فإنك لن تحصل على الخطأ البرمجي ولكن رابط سوف يشكو لأن أسماء المزين تختلف. يظهر الخطأ رابط فقط رمزا انها تبحث عنه، وأنه من السهل أن نغفل عن عدم تطابق الطبقة الرئيسية هناك، وبالتالي فإن والإنذار المترجم أكثر تفصيلا في وقت سابق ثمين. ما زال من الممكن أن الروايتين لا تظهر في وحدة تجميع نفسها، وبطبيعة الحال، وأنت من المحتمل أن يكون خدش رأسك لفترة من الوقت إذا كنت تعتقد أن الفرق الوحيد هو رؤية التقصير عضوا.

والفرق في تغيير اسم يتعارض مع معيار C ++، التي تقول أن الإعلانات إلى الأمام مثل struct Foo; وclass Foo; تعادل، ولذا يجب استخدام نفس تغيير اسم.

وعلى الرغم من أن هذا يعتبر ممارسة سيئة، وأعتقد أنه ينبغي أن يكون هناك أي مشكلة خلط تعريف الفئة وإعلان البنية، لأنها في الأساس نفس نوع البيانات. والفرق الرئيسي هو أن أعضاء البنية ومن قبل الجمهور الافتراضي، على عكس أعضاء الطبقة التي تكون خاصة، ولكن على خلاف تخطيط الذاكرة متطابقة.

وشيء واحد رأيت التي يمكن أن تسبب هذا التحذير تحاول قم بإجراء #import في الملف .tlb من DLL في حين وجود أيضا نفس DLL كمرجع في المشروع. أنا فقط إصلاح مشكلة مع هذا عن طريق إزالة DLL كمرجع من ضمن مشروعي.

في ج ++ ال فقط الفرق بين الفئة والبنية هو أن متغيرات أعضاء الفئة ووظائف الأعضاء والفئات الأساسية خاصة بشكل افتراضي، بينما في البنية تكون عامة بشكل افتراضي؛لذا، فإن حقيقة أن الفصل هو POD لا ينبغي أن يحدث أي فرق هنا.
أعتقد أن هذا التحذير يأتي من صيانة الكود (تم تحديث التعريف في مكان ما ولكن ليس في مكان آخر)، وقم بإصلاح الكود بحيث يختفي التحذير (على سبيل المثال.باستخدام فئة في typedef).

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