任意大小的枚举值

Mr.*_*ith 2 c++ gcc visual-c++

我正在编译为GCC编写的代码,在Visual C++ 2012中.我收到有关枚举值截断的警告,其中包含以下枚举(由于值超出了int的范围):

enum tile_flags {
   TILE_FLAG_INNER_FLAME= 0x10000000ULL,
    TILE_FLAG_CONSTRICTED= 0x20000000ULL,

    TILE_FLAG_MIMIC_INEPT 0x2000000000ULL
    TILE_FLAG_MIMIC 0x4000000000ULL
    TILE_FLAG_MIMIC_RAVEN 0x6000000000ULL
    TILE_FLAG_MIMIC_MASK 0x6000000000ULL
}
Run Code Online (Sandbox Code Playgroud)

在编译x86时,看起来MSVC会简单地截断枚举值以适应32位.但是,GCC中没有发生截断.海湾合作委员会发生了什么?我怎样才能为MSVC做这项工作?

chr*_*ris 10

从N3485,§7.2/ 6:

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

因此,如果MSVC具有必要的long long支持,则无论如何都应该使其成为基础类型.看到它没有,你可以尝试一下来哄它.

指定基础类型:

enum tile_flags : unsigned long long {
    ...
};
Run Code Online (Sandbox Code Playgroud)

  • @RandyGaul,是的,它仍然是一个独特的类型.它只使用无符号长long来存储值.这是一个C++ 11功能.您还可以使用作用域枚举,这会强制您使用"EnumName :: Value"并且不会隐式转换为整数. (4认同)