首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >任意大小的枚举值

任意大小的枚举值
EN

Stack Overflow用户
提问于 2013-05-15 01:43:49
回答 2查看 158关注 0票数 2

我正在编译为GCC编写的代码,在Visual C++ 2012中。我收到以下枚举的关于枚举值截断的警告(由于值在int的范围之外):

代码语言:javascript
复制
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上工作呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-15 01:44:46

摘自N3485,§7.2/6:

对于基础类型不是fix的枚举,基础类型是可以表示枚举中所有fined枚举器值的整数类型。如果没有整数类型可以表示所有枚举值,则枚举的格式不正确。除非枚举数的值不能在整型或无符号整型中fit,否则基础类型不能大于整型。如果枚举器列表为空,则基础类型就像枚举具有值为0的单个枚举器一样。

因此,如果MSVC有必要的long long支持,它无论如何都应该使其成为底层类型。既然它不是这样,有一件事你可以试着哄骗它。

指定基础类型:

代码语言:javascript
复制
enum tile_flags : unsigned long long {
    ...
};
票数 10
EN

Stack Overflow用户

发布于 2013-05-15 02:09:39

如果您需要更多的条目,而unsigned long long无法满足您的需求,请尝试使用结构:

代码语言:javascript
复制
struct tile_flags {
   bool innerFlame : 1;
   bool constricted : 1;
   bool mimicInept : 1;
   bool mimic : 1;
   // etc
};

这使用位字段,这通常意味着值将被尽可能紧密地打包,虽然它可以使构造比传统的标志数更困难,但它是比sizeof unsigned long long位更简单的选择。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16549548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档