Frage

Ich habe dieses Makro definiert gesehen vor, aber nie wusste, seinen Zweck wirklich. Kann jemand Licht in diese?

War es hilfreich?

Lösung

Dies ist ein intrinsischer Compiler für die Optimierung verwendet, in der Regel in Embedded-Programmierung gesehen. Das einzige Mal, ich habe es in der „default“ verwendet gesehen für eine Switch-Anweisung zu behaupten, dass die Variable eine begrenzte Reichweite hat (für eine bessere Optimierung). Beispiel:

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

Wahrscheinlich mit allen Compilern nicht funktioniert ...

Andere Tipps

Als FYI, hat MSVC etwas ähnliches (mit einem bisschen mehr Flexibilität), die __assume() intrinsischer. Ein Beispiel dafür geben sie:

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

Ich bin nicht sicher, welche Version von MSVC dies wurde zum ersten Mal unterstützt.

Ich habe es nicht gesehen, aber STFW mit Google kommt zuerst mit dieser Frage, und dann einige andere Referenzen. Von dem, was er sagt, ist es eindeutig ein Hinweis an den Compiler, dass der Code nicht ausgeführt wird - so kann der Compiler-Optimierung tun. Es könnte berechtigterweise als Vorwand betrachtet werden setzen ‚assert (0)‘ an seinem Platz - da der Code nie ausgeführt werden, die Behauptung wird nie Feuer. Natürlich, wenn die Behauptung Feuer der Fall ist, dann wissen Sie, Sie ein Problem haben.

Sehen Sie das klassische Papier auch "Can not Happen oder / * NOTREACHED * / oder Real Programme Dump-Core „.

Lesenswert, auch jetzt.

Ich habe Dinge so gesehen, bevor sie als Teil der Prüfung. Wenn es ist ausgeführt, dann wissen Sie, dass Sie einen Fehler haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top