_never_executed()の目的は?
-
03-07-2019 - |
質問
このマクロは以前に定義されたことがありますが、その目的を実際には知りませんでした。誰でもこれに光を当てることができますか?
解決
これは、組み込みプログラミングで一般的に見られる、最適化に使用されるコンパイラ組み込み関数です。私がそれを使用したのを見たのは、「デフォルト」 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コア" 。
今でも読む価値がある。
私は以前、テストの一環としてそのようなことを見てきました。実行された場合、バグがあることがわかります。
所属していません StackOverflow