Pregunta

He visto esta macro definida anteriormente, pero nunca supe realmente su propósito. ¿Alguien puede arrojar luz sobre esto?

¿Fue útil?

Solución

Este es un compilador intrínseco utilizado para la optimización, que suele verse en la programación integrada. La única vez que lo he visto usado es en " predeterminado " para que una declaración de cambio afirme que la variable tiene un rango limitado (para una mejor optimización). Ejemplo:

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

Probablemente no funcione con todos los compiladores ...

Otros consejos

Como FYI, MSVC tiene algo similar (con un poco más de flexibilidad), __assume () intrínseco. Un ejemplo que dan:

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

No estoy seguro de qué versión de MSVC se admitió por primera vez.

No lo he visto antes, pero a STFW con Google se le ocurre esta pregunta primero, y luego algunas otras referencias. Por lo que dice, es claramente una sugerencia para el compilador que el código nunca se ejecuta, por lo que el compilador puede hacer optimización. Se podría considerar legítimamente como una excusa para poner 'assert (0)' en su lugar, ya que el código nunca se ejecutará, la afirmación nunca se activará. Por supuesto, si la afirmación se dispara, entonces sabes que tienes un problema.

Consulte también el documento clásico " No puede ocurrir o / * NOTREACHED * / o Real Programs Dump Núcleo " .

Vale la pena leerlo, incluso ahora.

He visto cosas así antes como parte de las pruebas. Si se ejecuta , entonces sabrá que tiene un error.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top