我以前见过这个宏定义,但从来没有真正知道它的用途。任何人都可以阐明这一点吗?
Jeff V
问问题
411 次
4 回答
5
这是用于优化的编译器内在函数,通常在嵌入式编程中看到。我看到它使用的唯一一次是在 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;
}
可能不适用于所有编译器...
于 2008-10-16T13:19:15.387 回答
1
我以前没见过,但谷歌的 STFW 首先提出了这个问题,然后是其他一些参考资料。从它所说的来看,这显然是对编译器的一个提示,即代码永远不会执行——因此编译器可以进行优化。可以合理地将其视为将 'assert(0)' 置于其位置的借口——因为代码永远不会被执行,断言永远不会触发。当然,如果断言确实触发了,那么你就知道你遇到了问题。
另请参阅经典论文“Can't Happen or /* NOTREACHED */ or Real Programs Dump Core”。
值得一读,即使是现在。
于 2008-10-16T13:16:36.377 回答
1
作为一个仅供参考,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。
于 2008-10-16T16:15:01.663 回答
0
作为测试的一部分,我以前见过类似的事情。如果它被执行,那么你就知道你有一个错误。
于 2008-10-16T12:33:16.680 回答