Domanda

Ho visto questa macro definita prima ma non ho mai saputo davvero il suo scopo. Qualcuno può far luce su questo?

È stato utile?

Soluzione

Questo è un compilatore intrinseco utilizzato per l'ottimizzazione, in genere visto nella programmazione integrata. L'unica volta che l'ho visto è nel "quot" predefinito " per un'istruzione switch per affermare che la variabile ha un intervallo limitato (per una migliore ottimizzazione). Esempio:

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

Probabilmente non funziona con tutti i compilatori ...

Altri suggerimenti

Come FYI, MSVC ha qualcosa di simile (con un po 'più di flessibilità), il __assume () intrinseco. Un esempio che danno:

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

Non sono sicuro di quale versione di MSVC sia stata inizialmente supportata.

Non l'ho mai visto prima, ma STFW con Google pone prima questa domanda e poi altri riferimenti. Da quello che dice, è chiaramente un suggerimento per il compilatore che il codice non viene mai eseguito, quindi il compilatore può fare l'ottimizzazione. Potrebbe legittimamente essere considerata una scusa per mettere "assert (0)" al suo posto - dal momento che il codice non verrà mai eseguito, l'asserzione non verrà mai attivata. Naturalmente, se l'affermazione fa fuoco, allora sai che hai un problema.

Vedi anche il classico documento " Can't Happen o / * NOTREACHED * / o Real Program Dump nucleo ".

Merita una lettura, anche adesso.

Ho già visto cose del genere prima come parte dei test. Se viene eseguito , allora sai che hai un bug.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top