繁体   English   中英

在VS2005下出现奇怪的“警告C4127:条件表达式恒定”

[英]odd “warning C4127: conditional expression is constant” under VS2005

我正在尝试使用级别4的警告编译LightZPng 。我在显然不值得该警告的行上得到了很多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之外,如何更改此代码以避免警告?

在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 )。

只需注释掉该行或从文件中删除该行(我实际上无法弄清楚他们为什么会这样做)。

是的,这很奇怪。 因为i在循环中更改,所以它实际上不是常数表达式。 因此,VS2005似乎是一个问题。 就其价值而言,VS2008所做的事情完全相同。

奇怪的是,一个仅包含此内容的项目不会抱怨,因此它很可能是Microsoft警告生成代码的一些奇怪的极端情况:

#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"

我在VS2005上对其进行了测试,即使在警告级别4上也不会出现警告。

您可以按照以下简单步骤操作:

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

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

-如果是,我认为您的优化设置可能是造成这种情况的原因。

根据Charles Nicholson的说法 ,Visual Studio 2005通过“ do...while(0) ”技巧给出了此错误:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM