我曾经见过这个宏,但从未真正知道它的目的。任何人都可以阐明这一点吗?_never_executed()的用途?
2
A
回答
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首次被支持。
相关问题
- 1. RemoveAll的用途()
- 2. UIControlStateSelected的用途
- 3. OptionArg的用途
- 4. webAppRootKey的用途?
- 5. CBCharacteristicPropertyBroadcast的用途
- 6. java.library.path的用途
- 7. NSRefreshedObjectsKey的用途
- 8. @SuppressWarnings的用途
- 9. 的用途MapAll(// @)
- 10. constexpr的用途
- 11. Ember.Container的用途
- 12. __init__的用途
- 13. UIGuidedAccessRestrictionDelegate的用途
- 14. ServiceSecurityContext.WindowsIdentity的用途?
- 15. ActionName的用途
- 16. LoweredUserName的用途?
- 17. CALayer的用途?
- 18. AssertRequiredRoles的用途?
- 19. issetugid的用途?
- 20. socket.shutdownOutput()的用途
- 21. django:django.utils.functional.SimpleLazyObject的用途?
- 22. 用途
- 23. 用途上的UIWebView
- 24. 视口的用途
- 25. 'and'in assembly的用途
- 26. “新双”的用途
- 27. XSLT中$的用途
- 28. i18n库的用途
- 29. Spring Framework的用途
- 30. git checkout的用途
你能找出它是如何定义的并添加到这个问题吗? – 2008-10-16 12:10:52