Pergunta

Eu já vi esse macro definido antes, mas nunca realmente sabia o seu propósito. Alguém pode lançar luz sobre isso?

Foi útil?

Solução

Esta é uma intrínseca compilador usado para otimização, normalmente visto na programação incorporado. A única vez que eu vi sendo utilizado está no "default" para uma instrução switch para afirmar que a variável tem um alcance limitado (para melhor otimização). Exemplo:

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

Provavelmente não funciona com todos os compiladores ...

Outras dicas

Como um FYI, MSVC tem algo semelhante (com um pouco mais de flexibilidade), a __assume() intrínseco. Um exemplo que eles dão:

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.
   }
}

Eu não tenho certeza qual versão do MSVC este foi apoiado em primeiro lugar.

Eu não vi isso antes, mas STFW com Google surge com esta questão em primeiro lugar, e então algumas outras referências. Pelo que se diz, é claramente uma dica para o compilador que o código nunca é executado - para que o compilador pode fazer a otimização. Ele poderia legitimamente ser considerado como uma desculpa para colocar 'assert (0)' em seu lugar - uma vez que o código nunca será executado, a afirmação nunca será fogo. Claro, se a afirmação faz fogo, então você sabe que você tem um problema.

Veja também o artigo clássico "Não pode acontecer ou / * NOTREACHED * / ou programas reais core dump ".

Vale a pena ler, mesmo agora.

Eu vi coisas assim antes, como parte de testes. Se é executado, então você sabe que você tem um bug.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top