【问题标题】:What is the underlying type of a c++ enum?c++ 枚举的底层类型是什么?
【发布时间】:2010-11-10 11:04:57
【问题描述】:

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

我有这个代码:

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, 
};

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

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

会有什么影响(如果有的话)
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,   
};

【问题讨论】:

    标签: c++ enums size types hex


    【解决方案1】:

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

    不过,无论在哪里使用,它都会隐式转换为 int

    C++11 变化

    自从引入类型枚举的 C++11 以来,这种情况发生了变化。无类型的enum 现在被定义为至少是int 的宽度(如果需要更大的值,则更宽)。但是,给定一个类型化的enum,定义如下:

    enum name : type {};
    

    name 类型的枚举具有type 的基础类型。例如,enum : char 定义了一个与char 相同宽度的enum,而不是int

    此外,enum 可以明确限定范围如下:

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

    (其中name 是必需的,但type 是可选的。)以这种方式声明的enum 将不再隐式转换为其基础类型(需要static_cast<>),并且必须使用完全引用- 限定名称。在此示例中,要将value 分配给enum 变量,您必须将其引用为name::value

    【讨论】:

      【解决方案2】:

      来自N4659 C++ 7.2/5

      对于底层类型不固定的枚举,底层类型是一个整数类型,可以表示枚举中定义的所有枚举值。如果没有整数类型可以表示所有枚举数值,则枚举格式错误。使用哪种整数类型作为基础类型由实现定义,除非基础类型不得大于int,除非枚举数的值不能适合intunsigned int。如果 enumerator-list 为空,则基础类型就好像该枚举有一个值为 0 的枚举数。

      【讨论】:

        【解决方案3】:

        IIRC 在内存中表示为 int。但是 gcc 有开关 -fshort-enum 使其成为适合所有值的最短整数类型,如果您需要节省空间。其他编译器也会有类似的东西。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-08-02
          • 2021-09-20
          • 1970-01-01
          • 2017-07-26
          • 1970-01-01
          • 2020-01-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多