Finalidade do _never_executed ()?
-
03-07-2019 - |
Pergunta
Eu já vi esse macro definido antes, mas nunca realmente sabia o seu propósito. Alguém pode lançar luz sobre isso?
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.