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

C++枚举的基本类型是什么?

  •  33
  • CodeFusionMobile  · 技术社区  · 15 年前

    这可能在其他地方得到了答复,但我找不到合适的答复。

    我有这个代码:

    enum enumWizardPage
    {
        WP_NONE = 0x00,  
        WP_CMDID = 0x01,    
        WP_LEAGUES = 0x02,  
        WP_TEAMS = 0x04,    
        WP_COMP = 0x08, 
        WP_DIVISIONS = 0x10,
        WP_FORMULAS = 0x20, 
        WP_FINISHED = 0x40, 
    };
    

    这是遗产,我必须通过添加一些新值来修改它。 问题是每个值都必须是唯一的位,因此它们可以或组合成位图。

    这些值是使用十六进制格式设置的,但我想知道这是否是它可以存储的最大值? 如果我将代码更改为

    enum enumWizardPage
    {
        WP_NONE = 0x0000,  
        WP_CMDID = 0x0001,  
        WP_LEAGUES = 0x0002,    
        WP_TEAMS = 0x0004,  
        WP_COMP = 0x0008,   
        WP_DIVISIONS = 0x0010,
        WP_FORMULAS = 0x0020,   
        WP_FINISHED = 0x0040,   
    };
    
    4 回复  |  直到 10 年前
        1
  •  38
  •   Kirill V. Lyadvinsky    15 年前

    从标准C+7.7.5:

    枚举的基础类型是可表示所有枚举器值的整数类型。 在枚举中定义。它是一个实现,定义了将哪个整型用作基础类型 对于枚举,基础类型不应大于int,除非enu的值- merator不能容纳int或unsigned int。如果枚举器列表为空,则基础类型为 好像枚举只有一个值为0的枚举器。应用于ENU的sizeof()值- meration type、枚举类型的对象或枚举器是应用于 基础类型。

        2
  •  36
  •   greyfade    10 年前

    C++枚举的类型是枚举本身。它的范围相当随意,但实际上,它的基础类型是 int .

    它隐式强制转换为 int 不管它在哪里使用。

    C++ 11的变化

    自从C++ 11引入了类型化枚举之后,这一点就发生了变化。非类型化的 enum 现在被定义为至少是 int (如果需要更大的值,则更宽)。但是,如果 枚举 定义如下:

    enum name : type {};
    

    类型的枚举 name 基础类型为 type . 例如, enum : char 定义一个 枚举 宽度与 char 而不是 int .

    此外,一个 枚举 可以显式确定作用域,如下所示:

    enum class name : type {
        value = 0,
        // ...
    };
    

    (何处) 名称 是必需的,但是 类型 是可选的。) 枚举 以这种方式声明的将不再隐式强制转换为其基础类型(需要 static_cast<> )和值必须用完全限定的名称引用。在本例中,要分配 value 到A 枚举 变量,必须将其引用为 name::value .

        3
  •  1
  •   cube    15 年前

    它在内存中表示为int。但是GCC有了转变 -fshort-enum 如果需要节省空间,将其设置为最短的整数类型,以适合所有值。其他编译器也有类似的功能。

        4
  •  -1
  •   dimba    15 年前

    基础类型是与枚举的最大/最小值相匹配的最小有符号整数。