Вопрос

Я видел определение этого макроса раньше, но никогда не знал его назначения.Может ли кто-нибудь пролить свет на это?

Это было полезно?

Решение

Это встроенная функция компилятора, используемая для оптимизации, обычно встречающаяся во встроенном программировании.Единственный раз, когда я видел его использование, это «по умолчанию» для оператора переключения, утверждающего, что переменная имеет ограниченный диапазон (для лучшей оптимизации).Пример:

 /* 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 с Google сначала поднимает этот вопрос, а затем некоторые другие ссылки.Судя по тому, что там написано, это явный намек компилятору на то, что код никогда не выполняется, поэтому компилятор может выполнить оптимизацию.Это можно было бы законно рассматривать как предлог, чтобы поставить вместо него «assert(0)» — поскольку код никогда не будет выполнен, утверждение никогда не сработает.Конечно, если утверждение сработает, вы знаете, что у вас проблема.

См. также классическую бумагу «Невозможно, или /* НЕДОСТИЖЕНО */ или Реальные программы выгружают ядро».

Стоит прочитать даже сейчас.

Я видел подобные вещи раньше в рамках тестирования.Если оно является выполнено, то вы знаете, что у вас есть ошибка.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top