سؤال

إذا كان لدي الرمز التالي:

for(int myvar = 0; myvar < 10; myvar++);
if(1)
{
    int var2 = 16;
}

ثم ، بعد ذلك كتبت ما يلي:

myvar = 0;
var2 = 0;

هل سيكون ذلك قانونيًا؟ يجمعها VC ++ 6 بشكل صحيح ، لكنني أعتقد أن هذا يجب أن يكون غير قانوني. (يعطي خطأ في أحد المترجمين الآخرين.)

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

المحلول

VC6 قديم إلى حد ما ، وليس دائمًا ... جامد ... في تطبيقه للمعيار :-) إنه في الواقع تسرب النطاق في ظروف معينة مثل:

for (int i = 0; i < 10; i++) { }
// You can still use 'i' here.

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

من ISO C ++ 11 3.3.3/1, ، التعامل مع إدخال نطاق الكتلة مع {...}:

الاسم المعلن في كتلة محلية لتلك الكتلة ؛ لديها نطاق كتلة. يبدأ نطاقه المحتمل عند إعلانه وينتهي في نهاية مجموعته.

الجزء 6.5.3 يغطي نطاق المتغيرات "التي تم إنشاؤها" بواسطة أ for بيان:

إذا for-init-statement هو إعلان ، ويمتد نطاق الاسم (الأسماء) إلى نهاية for-statement.

نصائح أخرى

لا ، لن يكون (§3.3.2 النطاق المحلي):

  1. الاسم المعلن في كتلة (6.3) محلية لتلك الكتلة. يبدأ نطاقه المحتمل عند إعلانه (3.3.1) وينتهي في نهاية منطقتها التصريحية.

أنصحك باستخدام المترجمين الذين تم إصدارهم في العقد الماضي.

يجب أن يكون ذلك غير قانوني ولكن VC6 كان سيئًا للغاية في ذلك.

في Visual Studio 2005 ، تم تقديم إعداد جديد على مستوى المشروع "قوة المطابقة في نطاق الحلقة". هذا يعالج المشكلة وقدم التوافق المتخلف أيضًا. مما يعني أن قواعد الكود الأقدم يمكن أن تتجمع في إصدارات أحدث من Visual Studio من خلال تعطيل هذا الإعداد.

ومع ذلك ، هناك شيء واحد فعله MS في VS2005 لتشغيل هذا بشكل افتراضي ، ومن ثم يقترب قليلاً من المعايير.

هل سيكون ذلك قانونيًا؟ يجمعها VC ++ 6 بشكل صحيح ، لكنني أعتقد أن هذا يجب أن يكون غير قانوني.

لا ، لا ينبغي أن يكون قانونيا. تفريغ VC ++ 6. استخدم مترجم جديد وأفضل.

استغرق VC حوالي عقد من الزمان لتنفيذ النطاق المناسب للمتغيرات المعلنة في الحلقات والبيانات الشرطية. بشكل عام ، لا يمكنك الاعتماد على الحكم VC6 بخصوص C ++.

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