带位的长枚举
Long enum with bitwise
本文关键字:枚举 更新时间:2023-10-16
在通过第32个标志后,我的enum
一直面临问题
enum ConditionType_t {
CONDITION_NONE = 0,
CONDITION_LIGHT = 1 << 0,
CONDITION_INFIGHT = 1 << 1,
CONDITION_MUTED = 1 << 2,
...
CONDITION_LUCKY = 1 << 32,
}
知道enums
基本上是8bit
,CONDITION_LUCKY
将等于CONDITION_NONE
。所以我实现了C++11
的enum classes
:
enum class ConditionType_t : uint64_t {
CONDITION_NONE = 0,
CONDITION_LIGHT = 1 << 0,
CONDITION_INFIGHT = 1 << 1,
CONDITION_MUTED = 1 << 2,
...
CONDITION_LUCKY = 1 << 32,
}
现在我收到了数百万条警告,比如:
warning C4293: '<<' : shift count negative or too big, undefined behavior
错误如:
error C2065: 'CONDITION_NONE' : undeclared identifier
显然,比特移位与enum classes
不兼容。
有什么想法吗?
表达式1 << 32
是未定义的行为。来自[expr.shift]:
如果右操作数为负数,或大于或等于提升后的左操作数的位长度。
由于1
是int
,所以它只有32位。即使这不是未定义的,你也不会得到你想要的值,因为1 << 32
的类型是int
,它无论如何都不能容纳33位的值。
您需要从一开始就使用uint64_t
:
enum class ConditionType_t : uint64_t {
CONDITION_NONE = 0,
CONDITION_LIGHT = 1ULL << 0,
CONDITION_INFIGHT = 1ULL << 1,
CONDITION_MUTED = 1ULL << 2,
...
CONDITION_LUCKY = 1ULL << 32,
};
相关文章:
- 不带大括号的枚举形式
- 枚举环境变量的惯用C++14/C++17方法
- 类似枚举的计算常量
- 如何正确实现和访问运算符的各种自定义枚举器
- 错误:从"int"到枚举c++的转换无效
- C++中构造函数中的枚举
- 访问在 C++ 结构中声明的枚举变量
- 枚举类'classname'的多重定义
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- typedef 枚举和枚举类有什么区别?
- 为什么我的开关/机箱在使用枚举时默认?
- 标准::可选枚举的比较运算符
- C++两个源文件之间共享的枚举的静态实例
- 打印没有铸件的枚举可以在C++中吗?
- 枚举成员与静态 int 成员?
- C++:枚举:错误:应使用标识符而不是"}"
- 带有 c++ 的枚举(输入检查)
- 在 qml 中使用 Q_ENUM 和 Q_PROPERTY 作为枚举类
- 为什么 int 类型的枚举类值不能用作 int
- 在 C++ 中输出枚举类类型的向量元素