在coding style question about infinite loops中,有些人提到他们更喜欢for(;;)样式,因为while(true)样式在MSVC上给出关于条件表达式常量的警告消息。条件表达式中的常量值
这让我很吃惊,因为在条件表达式中使用常数值是避免#ifdef地狱的有用方法。举例来说,你可以在你的头:
#ifdef CONFIG_FOO
extern int foo_enabled;
#else
#define foo_enabled 0
#endif
和代码可以简单的使用条件,并相信编译器的的Elid死代码没有被定义CONFIG_FOO时:
if (foo_enabled) {
...
}
代替具有每次foo_enabled测试对于CONFIG_FOO用于:
#ifdef CONFIG_FOO
if (foo_enabled) {
...
}
#endif
这种设计模式用于所有的时间在Linux内核(例如,包括/ LINUX/cpumask.h定义了几个MACR当禁用SMP时将OS设置为1或0,并在启用SMP时将其设置为函数调用)。
MSVC警告的原因是什么?此外,有没有更好的方法避免#ifdef地狱,而不必禁用该警告?或者这是一个过于宽泛的警告,一般不应该启用?
好点。这是人们看到“向后”比较的原因之一,如“if(0 == x)” - 如果您错过了一个=符号,编译器会捕获它! – bog 2008-10-22 03:51:24
如果这就是它想要捕捉的,是不是它只能捕捉到(在一个条件中的赋值)而不是更一般的警告? – CesarB 2008-10-22 03:54:09