代码之家  ›  专栏  ›  技术社区  ›  CesarB

条件表达式中的常量值

  •  8
  • CesarB  · 技术社区  · 17 年前

    在一个 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) {
        ...
    }
    

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

    MSVC发出警告的原因是什么?此外,有没有更好的方法避免“ifdef地狱”,而不必禁用该警告?或者这是一个过于宽泛的警告,一般不应启用?

    4 回复  |  直到 9 年前
        1
  •  10
  •   Menkboy    17 年前

    警告并不自动意味着代码是错误的 令人不快的

    就我个人而言,我从一个能够启用所有警告的位置开始,然后关闭任何被证明是恼人而不是有用的警告。当你把任何东西扔到垃圾堆上的时候,它总是第一个开火的。

        2
  •  5
  •   Ferruccio    17 年前

    const int x = 0;
    

    if (x != 0) ...
    

        3
  •  2
  •   James Curran    17 年前

    我相信这是为了捕捉像这样的东西

     if( x=0 )
    

     if( x==0 )
    
        4
  •  0
  •   bog    17 年前

    避免警告的简单方法是:

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