2

我以前见过这个宏定义,但从来没有真正知道它的用途。任何人都可以阐明这一点吗?

4

4 回答 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 回答