سؤال

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

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

المحلول

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

 /* Get DTMF index */
 switch(dtmf)
 {
     case '0':
     case '1':
     case '2':
     case '3':
     case '4':
     case '5':
     case '6':
     case '7':
     case '8':
     case '9':
         /* Handle numeric DTMF */
         index = dtmf - '0';
         break;
     case 'A':
     case 'B':
     case 'C':
     case 'D':
         index = dtmf - 'A' + 10;
         break:
     default:
         _never_executed();
         break;
 }

وربما لا يعمل مع جميع المجمعين ...

نصائح أخرى

وكما لمعلوماتك، MSVC لديه شيء مماثل (مع أكثر قليلا من المرونة)، في __assume() جوهري. ومن الأمثلة التي يطلقونها:

int main(int p)
{
   switch(p){
      case 1:
         func1(1);
         break;
      case 2:
         func1(-1);
         break;
      default:
         __assume(0);
            // This tells the optimizer that the default
            // cannot be reached. As so, it does not have to generate
            // the extra code to check that 'p' has a value 
            // not represented by a case arm. This makes the switch 
            // run faster.
   }
}

ولست متأكدا أي إصدار من MSVC هذا وأيد أولا.

وأنا لم أر ذلك من قبل، ولكن STFW مع جوجل يأتي مع هذه المسألة أولا، وبعد ذلك بعض المراجع الأخرى. من ما يقول، فمن الواضح أنه إشارة إلى المترجم أن رمز يتم أبدا تنفيذ - حتى المترجم يمكن القيام الأمثل. يمكن شرعا أن ينظر إليه على أنه ذريعة لوضع "ASSERT (0)" في مكانها - منذ لن يتم تنفيذ التعليمات البرمجية، سوف التأكيد أبدا النار. وبطبيعة الحال، إذا كان التأكيد لا النار، ثم كنت أعلم أنك قد حصلت على المشكلة.

وانظر أيضا ورقة الكلاسيكية "لا يمكن أن يحدث أو / * * NOTREACHED / أو برامج ريال تفريغ الأساسية ".

وتستحق القراءة، حتى الآن.

ولقد رأيت أشياء من هذا القبيل قبل كجزء من الاختبار. إذا كان <م> هو تنفيذها، ثم أنت تعلم أن لديك علة.

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