2008-10-16 10 views
2

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

+1

Можете ли вы узнать, как это определено и добавить к этому вопросу? – 2008-10-16 12:10:52

ответ

5

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

/* 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; 
} 

Вероятно, не работает со всеми компиляторами ...

0

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

1

Я раньше этого не видел, но STFW с Google сначала задает этот вопрос, а затем некоторые другие ссылки. Из того, что он говорит, это явно намек на компилятор, что код никогда не выполняется - поэтому компилятор может сделать оптимизацию. Его можно было бы законно считать оправданием для того, чтобы поставить «assert (0)» на свое место, поскольку код никогда не будет выполнен, утверждение никогда не будет срабатывать. Конечно, если утверждение срабатывает, то вы знаете, что у вас есть проблема.

См. Также классическую бумагу "Can't Happen or /* NOTREACHED */ or Real Programs Dump Core".

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

1

В качестве FYI, 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 была впервые поддержана.

 Смежные вопросы

  • Нет связанных вопросов^_^