2008-10-22 99 views
8

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地狱,而不必禁用该警告?或者这是一个过于宽泛的警告,一般不应该启用?

回答

10

警告并不意味着代码是不好,只是看起来很可疑。我个人从一个能够启用所有警告的位置开始,然后关闭那些证明比有用的更烦人的位置。那个随时都会发射的东西通常是第一个去的。

2

我相信这是对捕获到像

if(x=0) 

当你的意思是

if(x==0) 
+0

好点。这是人们看到“向后”比较的原因之一,如“if(0 == x)” - 如果您错过了一个=符号,编译器会捕获它! – bog 2008-10-22 03:51:24

+0

如果这就是它想要捕捉的,是不是它只能捕捉到(在一个条件中的赋值)而不是更一般的警告? – CesarB 2008-10-22 03:54:09

0

一个简单的方法来避免该警告是:

#ifdef CONFIG_FOO 
extern int foo_enabled; 
#else 
extern int foo_enabled = 0; 
#endif 
5

我认为原因警告的是,你可能无意中有一个更复杂的表达式,在没有意识到的情况下评估为常量。假设你有一个头这样的声明:

const int x = 0; 

再后来,远离x的声明,你有一个条件,如:

if (x != 0) ... 

你可能不会注意到这是一个常数表达。