Question

J'ai déjà vu cette macro définie, mais je ne connaissais pas vraiment son objectif. Quelqu'un peut-il nous éclairer?

Était-ce utile?

La solution

C’est un compilateur intrinsèque utilisé pour l’optimisation, généralement utilisé dans la programmation intégrée. La seule fois où je l’ai vu utilisé se trouve dans le champ "par défaut". pour une instruction switch affirmant que la variable a une plage limitée (pour une meilleure optimisation). Exemple:

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

Ne fonctionne probablement pas avec tous les compilateurs ...

Autres conseils

En tant que FYI, MSVC a quelque chose de similaire (avec un peu plus de souplesse), le __ assum () intrinsèque. Un exemple qu'ils donnent:

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

Je ne sais pas quelle version de MSVC a été prise en charge pour la première fois.

Je ne l’ai jamais vue auparavant, mais STFW avec Google pose cette question en premier, puis quelques autres références. D'après ce qu'il dit, cela indique clairement au compilateur que le code n'est jamais exécuté - le compilateur peut donc procéder à l'optimisation. Cela pourrait légitimement être considéré comme une excuse pour mettre 'assert (0)' à sa place - car le code ne sera jamais exécuté, l'assertion ne sera jamais renvoyée. Bien sûr, si l'assertion se déclenche, alors vous savez que vous avez un problème.

Voir aussi le document classique "Ça ne peut pas arriver ou / * NOTREACHED * / ou Real Program Dump Noyau ".

À lire, même maintenant.

J'ai déjà vu de telles choses dans le cadre de tests. Si il est exécuté, alors vous savez que vous avez un bogue.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top