条件表达式中的常量值

时间:2008-10-22 03:46:13

标签: c++ c warnings visual-c++

coding style question about infinite loops中,有些人提到他们更喜欢for(;;)样式,因为while(true)样式在MSVC上给出关于条件表达式是常量的警告消息。

这让我感到非常惊讶,因为在条件表达式中使用常量值是避免#ifdef地狱的有用方法。例如,您可以在标题中输入:

#ifdef CONFIG_FOO
extern int foo_enabled;
#else
#define foo_enabled 0
#endif

代码可以简单地使用条件并信任编译器在未定义CONFIG_FOO时删除死代码:

if (foo_enabled) {
    ...
}

每次使用foo_enabled时都不必测试CONFIG_FOO:

#ifdef CONFIG_FOO
if (foo_enabled) {
    ...
}
#endif

此设计模式一直在Linux内核中使用(例如,include / linux / cpumask.h在禁用SMP时将几个宏定义为1或0,在启用SMP时定义函数调用)。

MSVC警告的原因是什么?另外,有没有更好的方法来避免#ifdef hell而不必禁用该警告?或者这是一个过于广泛的警告,一般不应该启用?

4 个答案:

答案 0 :(得分:10)

警告不会自动表示代码错误,只是看起来很可疑。

就个人而言,我从一个能够启用所有警告的位置开始,然后关闭任何证明比使用更烦人的事情。任何时候你向布尔施放任何东西都会发射的那个通常是第一个去的。

答案 1 :(得分:5)

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

const int x = 0;

然后,远离x的声明,你有一个像:

的条件
if (x != 0) ...

您可能不会注意到它是一个常量表达式。

答案 2 :(得分:2)

我相信它会抓住像

这样的东西
 if( x=0 )

当你意味着

 if( x==0 )

答案 3 :(得分:0)

避免警告的一种简单方法是:

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