0

我正在尝试编译带有第 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

4 回答 4

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我想的那样)。

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

于 2009-06-12T03:24:45.703 回答
1

是的,这很奇怪。它确实不是一个常量表达式,因为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 顶部有一个导致问题的原因。

于 2009-06-12T02:51:28.480 回答
0

我在我的 VS2005 上测试它并没有出现警告,即使是在警告级别 4。。

一个简单的程序供您遵循:

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

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

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

于 2009-06-12T03:28:39.610 回答
0

根据 Charles Nicholsondo...while(0)的说法,Visual Studio 2005 使用“ ”技巧给出了这个错误:

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

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

于 2009-06-12T03:38:35.530 回答