質問

このマクロは以前に定義されたことがありますが、その目的を実際には知りませんでした。誰でもこれに光を当てることができますか?

役に立ちましたか?

解決

これは、組み込みプログラミングで一般的に見られる、最適化に使用されるコンパイラ組み込み関数です。私がそれを使用したのを見たのは、「デフォルト」 switchステートメントで、変数の範囲が制限されていることをアサートします(最適化を向上させるため)。例:

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

おそらくすべてのコンパイラで動作するわけではありません...

他のヒント

FYIとして、MSVCには似たようなものがあります(もう少し柔軟性があります)、 __ assume() 組み込み関数。彼らが与える一例:

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

最初にサポートされたMSVCのバージョンがわかりません。

これまで見たことはありませんが、STFWとGoogleが最初にこの質問を思いついた後、他の参考文献をいくつか紹介します。それが言っていることから、それは明らかにコードが決して実行されないというコンパイラーへのヒントです-コンパイラーは最適化を行うことができます。合法的に、 'assert(0)'を代わりに置く言い訳と見なすことができます。コードは実行されないため、アサーションは実行されません。もちろん、アサーションが起動した場合、問題があることがわかります。

古典的な論文もご覧ください"できませんまたは/ * NOTREACHED * /またはReal Programs Dumpコア"

今でも読む価値がある。

私は以前、テストの一環としてそのようなことを見てきました。実行された場合、バグがあることがわかります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top