2008-10-16 48 views
2

我曾经见过这个宏,但从未真正知道它的目的。任何人都可以阐明这一点吗?_never_executed()的用途?

+1

你能找出它是如何定义的并添加到这个问题吗? – 2008-10-16 12:10:52

回答

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; 
} 

可能并不适用于所有的编译器工作...

0

作为测试的一部分,我已经看过类似的东西。如果它执行,那么你知道你有一个错误。

1

我以前没有见过它,但STFW与谷歌首先提出这个问题,然后一些其他参考。从它所说的话,这显然是编译器的暗示,代码从未被执行 - 所以编译器可以进行优化。它可以被合理地视为将'assert(0)'置于其位置的借口 - 因为代码永远不会被执行,断言永远不会被触发。当然,如果断言确实触发了,那么你知道你有问题。

参见经典纸"Can't Happen or /* NOTREACHED */ or Real Programs Dump Core"

即使现在也值得一读。

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首次被支持。