_never_executed()的目的是什么?

时间:2008-10-16 12:06:54

标签: c embedded c-preprocessor intrinsics

我之前看过这个宏,但从未真正知道它的用途。有人能说清楚这个吗?

4 个答案:

答案 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)

作为测试的一部分,我之前见过这样的事情。如果 已执行,那么您就知道自己有错误。