我正在尝试编译带有第 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 以外的警告?
我正在尝试编译带有第 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 做的事情完全一样。
奇怪的是,一个只有这个的项目并没有抱怨,所以它很可能是微软警告生成代码的一些奇怪的边缘情况问题:
#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 程序员”的答案 - "#define for if (false) {} else for"
LightZ.cpp 顶部有一个导致问题的原因。
我在我的 VS2005 上测试它并没有出现警告,即使是在警告级别 4。。
一个简单的程序供您遵循:
- 创建一个新的控制台应用程序,只放置上面的代码,看看是否再次出现警告。
- 如果不是,请检查项目设置中的差异。
- 如果是,我会假设您的优化设置可能会导致它。
根据 Charles Nicholsondo...while(0)
的说法,Visual Studio 2005 使用“ ”技巧给出了这个错误:
#define MULTI_LINE_MACRO \
do { \
doSomething(); \
doSomethingElse(); \
} while(0)
如果您绝对必须,您可以使用__pragma指令选择性地禁用特定代码片段周围的警告。