为什么C ++会在具有负值的枚举上发出警告?

时间:2010-11-04 04:37:24

标签: c++ visual-c++ enums warnings compiler-warnings

我目前的代码类似于:

enum Enum1 : signed __int8
{
    Value1 = 1 ,
    Value2 = 2 ,
    Value3 = -3  // C4341
} ;

错误详情说明:
“警告C4341:'Value3':符号值超出枚举常量范围”

MSDN表示只有在使用int范围之外的值时才会出现此警告:
(> 2 ^ 31)OR(< 1 - 2 ^ 31)

为什么告诉我我的负面价值无效?这只是一个警告,但谷歌告诉我,这个警告表明这些枚举值将是未定义的 - 这将破坏我的程序。

4 个答案:

答案 0 :(得分:3)

对我来说似乎是一个错误。当前的0x草案并不表示情况属实,MSDN documentation也没有。

答案 1 :(得分:2)

您的回答基本上在这里描述:Are C++ enums signed or unsigned?

由编译器实现来定义枚举的值是有符号还是无符号。我假设他们在那里留下了警告,这样如果你或其他人使用不同的编译器,你可能会得到不同的行为。

答案 2 :(得分:2)

我正在使用Microsoft Visual Studio 2010.使用“char”或“signed char”代替“signed __int8”会产生相同的结果 - 即“-3”的C4341和0xFD的C4369 This other MSDN article明确指出“:signed __int8”明确指定了枚举器的基础类型。话虽如此,可以假设此警告的存在仅仅是为了让开发人员意识到可能与其他编译器不兼容。

答案 3 :(得分:1)

由于有人提到它是特定于编译器的,因此它适用于g ++,如下所示

#include <stdio.h>

enum Enum1
{
    Value1 = 1 ,
    Value2 = 2 ,
    Value3 = -3
} ;

enum Enum1 myval;


main(){
    myval = Value3;
    printf("%d\n", myval);
}

编译:{{1​​}}

运行时的结果: g++ negenum.cpp