[英]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.