我正在尝试编译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?
以外的警告答案 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指令有选择地禁用特定代码片段周围的警告。