我之前看过这个宏,但从未真正知道它的用途。有人能说清楚这个吗?
答案 0 :(得分:5)
这是用于优化的编译器内在函数,通常在嵌入式编程中看到。我唯一看到它使用的是在switch语句的“default”中断言变量的范围有限(为了更好的优化)。例如:
/* 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;
}
可能不适用于所有编译器...
答案 1 :(得分:1)
我之前没见过,但STFW与谷歌首先提出了这个问题,然后是其他一些参考资料。从它的内容来看,这显然是编译器的一个提示,即代码永远不会被执行 - 因此编译器可以进行优化。它可以合理地被视为将'assert(0)'置于其位置的借口 - 因为代码永远不会执行,断言永远不会触发。当然,如果断言发生了,那么你就知道你遇到了问题。
另见经典论文"Can't Happen or /* NOTREACHED */ or Real Programs Dump Core"。
值得一读,即使是现在。
答案 2 :(得分:1)
作为一个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。
答案 3 :(得分:0)
作为测试的一部分,我之前见过这样的事情。如果 已执行,那么您就知道自己有错误。