代码之家  ›  专栏  ›  技术社区  ›  Giffyguy

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

  •  4
  • Giffyguy  · 技术社区  · 15 年前

    我当前的代码类似于:

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

    错误详细信息状态:
    “警告C4341:“value3”:带符号的值超出枚举常量的范围”

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

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

    4 回复  |  直到 14 年前
        1
  •  3
  •   Steve M    15 年前

    在我看来像个虫子。当前的0x草稿不表示应该是这种情况,也不表示 MSDN documentation .

        2
  •  2
  •   Community Mohan Dere    9 年前

    你的回答基本上是这样描述的: Are C++ enums signed or unsigned?

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

        3
  •  2
  •   Giffyguy    15 年前

    我正在使用Microsoft Visual Studio 2010。使用“char”或“signed char”代替“signed_uuu int8”,得到相同的结果,即对于“-3”使用c341,对于0xfd使用c4369。
    This other MSDN article 明确指出“:signed uuInt8”显式指定枚举器的基础类型。也就是说,可以假定此警告的存在只是为了让开发人员知道可能与其他编译器不兼容。

        4
  •  1
  •   Simon    14 年前

    因为有人提到它是特定于编译器的,所以它可以与g++一起工作,如下所示

    #include <stdio.h>
    
    enum Enum1
    {
        Value1 = 1 ,
        Value2 = 2 ,
        Value3 = -3
    } ;
    
    enum Enum1 myval;
    
    
    main(){
        myval = Value3;
        printf("%d\n", myval);
    }
    

    编译: g++ negenum.cpp

    运行时的结果: -3