c ++枚举的基础类型是什么?

问题描述 投票:35回答:3

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

我有这个代码:

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
3个回答
38
投票

来自N4659 C++ 7.2/5

对于其基础类型未修复的枚举,基础类型是一个整数类型,可以表示枚举中定义的所有枚举器值。如果没有整数类型可以表示所有枚举器值,则枚举是不正确的。它是实现定义的,使用整数类型作为基础类型,除了基础类型不应大于int,除非枚举器的值不能适合intunsigned int。如果枚举器列表为空,则基础类型就好像枚举具有值为0的单个枚举器一样。


41
投票

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

尽管如此,它被隐含地投射到int的任何地方。

C++11 changes

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

enum name : type {};

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

此外,enum可以明确规定如下:

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

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


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.