任意大小的枚举值
arbitrarily sized enum values
我正在编译为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
}
在x86上编译时,MSVC似乎只是截断枚举值以适应32位。然而,在GCC中不发生截断。GCC发生了什么?我怎样才能使它为MSVC工作?
From N3485,§7.2/6:
因此,如果MSVC有必要的对于基础类型不固定的枚举,其基础类型为可执行以下操作的整型表示枚举中定义的所有枚举数值。如果没有整数类型可以表示所有的枚举值,则枚举格式错误。使用哪种整型由实现定义作为基础类型,但基础类型不得大于int,除非an的值枚举数不能装入整型或无符号整型。如果枚举器列表为空,则基础类型为就好像该枚举只有一个值为0的枚举数。
long long
支持,它应该使其成为底层类型。既然它不这么做,你可以试着用一种方法来哄它。
指定底层类型:
enum tile_flags : unsigned long long {
...
};
如果您需要的条目多于unsigned long long
所能获得的,请尝试使用struct:
struct tile_flags {
bool innerFlame : 1;
bool constricted : 1;
bool mimicInept : 1;
bool mimic : 1;
// etc
};
使用位域,这通常意味着值将尽可能紧密地打包,虽然它可以使构造比传统标志号更困难,但它是超过sizeof unsigned long long
位的最简单的选择。
相关文章:
- 不带大括号的枚举形式
- 枚举环境变量的惯用C++14/C++17方法
- 类似枚举的计算常量
- 如何正确实现和访问运算符的各种自定义枚举器
- 错误:从"int"到枚举c++的转换无效
- C++中构造函数中的枚举
- 访问在 C++ 结构中声明的枚举变量
- 枚举类'classname'的多重定义
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- C++关于ENUM的问题。我得到的响应比枚举列表大
- 与常规枚举相比,c++ 枚举结构的大小更大吗?
- 大括号使用枚举类初始化静态常量unordered_map
- 是否有一种有效的,适当的方法将非常大的公共班级枚举放在利用它们的公共方法之下,以使代码更加干净
- 枚举超过了最大数字类型的大小
- integer常量太大,以至于在为枚举分配最大类型值时它是无符号的
- 任意大小的枚举值
- 将基础类型的任意值强制转换为强类型枚举类型是否安全?
- 获取枚举的最大值
- 通过numeric_limits为枚举赋最大值
- C++枚举中的最大值和最小值