在VS2005下奇数“警告C4127:条件表达式是常数”

时间:2009-06-11 23:05:13

标签: visual-studio-2005 compiler-warnings c4127

我正在尝试编译LightZPng并在第4级发出警告。我在线路上得到了很多明显不值得警告的C4127。一个例子:

#define MAX_BITS 15
int values_per_bitlen[ MAX_BITS + 1 ];
for ( int i = 0; i <= MAX_BITS; ++i )    // C4127 is here
    values_per_bitlen[ i ] = 0;

如何更改此代码以避免#pragma?

以外的警告

4 个答案:

答案 0 :(得分:4)

LightZ.cpp顶部有一段代码如下:

#define for if (false) {} else for

这意味着您的实际陈述是:

#define for if (false) {} else for ( int i = 0; i <= MAX_BITS; ++i )

这就是为什么你得到常量表达式错误(它是false,而不是我想的i <= MAX_BITS

只需在文件中注释掉或删除该行(我实际上无法弄明白为什么会这样做)。

答案 1 :(得分:1)

是的,那很奇怪。由于i在循环中发生了变化,因此它确实是 not 一个常量表达式。所以这似乎是VS2005的一个问题。对于它的价值,VS2008完全一样。

奇怪的是,一个带有 这个项目的项目并没有抱怨,因此微软的警告生成代码可能会出现一些奇怪的边缘问题:

#define MAX_BITS 15
int values_per_bitlen[ MAX_BITS + 1 ];
int main(int argc, char* argv[]) {
    for ( int i = 0; i <= MAX_BITS; ++i )
        values_per_bitlen[ i ] = 0;
    return 0;
}

但是,你实际上没有问过一个问题。你想知道或希望我们做什么?

<强>更新

请参阅“Windows程序员”的实际原因答案 - LightZ.cpp顶部有一个"#define for if (false) {} else for"导致问题。

答案 2 :(得分:0)

我在我的VS2005上进行了测试,即使在警告级别4,也没有出现警告。

您可以遵循的简单程序:

- 创建一个新的控制台应用程序并仅放置上面的代码,看看警告是否再次显示。

- 如果没有,请检查项目设置的差异。

- 如果是,我会假设您的优化设置可能会导致它。

答案 3 :(得分:0)

According to Charles Nicholson,Visual Studio 2005使用“do...while(0)”技巧给出了此错误:

#define MULTI_LINE_MACRO \
    do { \
        doSomething(); \
        doSomethingElse(); \
    } while(0)

如果绝对必要,可以使用__pragma指令有选择地禁用特定代码片段周围的警告。