2008-10-16 6 views
2

J'ai vu cette macro définie auparavant mais je n'ai jamais vraiment connu son but. Quelqu'un peut-il faire la lumière sur cette question?Fonction de _never_executed()?

+1

Pouvez-vous trouver comment il est défini et ajouter à cette question? –

Répondre

5

Ceci est un compilateur intrinsèque utilisé pour l'optimisation, généralement vu dans la programmation intégrée. La seule fois que je l'ai vu utilisé dans le "défaut" pour une déclaration de commutateur pour affirmer que la variable a une portée 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; 
} 

probablement ne fonctionne pas avec tous les compilateurs ...

0

J'ai déjà vu des choses comme ça dans le cadre de tests. Si est exécuté, alors vous savez que vous avez un bug.

1

Je ne l'ai jamais vu auparavant, mais STFW avec Google propose d'abord cette question, puis d'autres références. De ce qu'il dit, il est clair que le compilateur sait que le code n'est jamais exécuté - donc le compilateur peut faire l'optimisation. Il pourrait légitimement être considéré comme une excuse pour mettre 'assert (0)' à sa place - puisque le code ne sera jamais exécuté, l'assertion ne se déclenchera jamais. Bien sûr, si l'assertion prend feu, alors vous savez que vous avez un problème.

Voir aussi le papier classique "Can't Happen or /* NOTREACHED */ or Real Programs Dump Core".

Cela vaut la peine d'être lu, même maintenant.

1

En tant que votre information, MSVC a quelque chose de similaire (avec un peu plus de flexibilité), la __assume() 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.