このマクロが以前に定義されているのを見たことがありますが、その目的を本当に知りませんでした。誰でもこれに光を当てることができますか?
4 に答える
これは、最適化に使用されるコンパイラ組み込みであり、組み込みプログラミングでよく見られます。これが使用されているのを私が見たのは、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;
}
おそらくすべてのコンパイラで動作するとは限りません...
これまでに見たことはありませんが、STFW with Google は最初にこの質問を提示し、次に他の参考文献をいくつか提示します。それが言っていることから、コードが決して実行されないというコンパイラへのヒントであることは明らかです。したがって、コンパイラは最適化を行うことができます。'assert(0)' をその場所に配置する言い訳と見なすことができます。コードは決して実行されないため、アサーションは決して起動しません。もちろん、アサーションが発生した場合は、問題があることがわかります。
古典的な論文「Can't Happen or /* NOTREACHED */ or Real Programs Dump Core」も参照してください。
今でも読む価値あり。
参考までに、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 のバージョンはわかりません。
私は以前、テストの一環としてそのようなことを見てきました。それが実行された場合、あなたはあなたがバグを持っていることを知っています。