将枚举与整数进行比较
Comparing enums to integers
我读到过,您不应该相信枚举的底层实现是有符号的还是无符号的。由此,我得出结论,您应该始终将枚举值强制转换为要与之进行比较的类型。像这样:
enum MyEnum { MY_ENUM_VALUE = 0 };
int i = 1;
if (i > static_cast<int>(MY_ENUM_VALUE))
{
// do stuff
}
unsigned int u = 2;
if (u > static_cast<unsigned int>(MY_ENUM_VALUE))
{
// do more stuff
}
这是最好的做法吗?
编辑:如果枚举是匿名的,情况会改变吗?
enum
是一个整数,因此您可以将其与任何其他整数进行比较,甚至可以浮动。编译器将在比较之前自动将两个整数转换为最大值,或将枚举转换为双精度。
现在,如果您的枚举本身不应该表示一个数字,那么您可能需要考虑创建一个类:
enum class some_name { MY_ENUM_VALUE, ... };
int i;
if(i == static_cast<int>(some_name::MY_ENUM_VALUE))
{
...
}
在这种情况下,您需要强制转换,因为默认情况下枚举类不会被视为整数。这在很大程度上有助于避免错误,以防您滥用枚举值。。。
更新:此外,您现在可以指定enum
的整数类型。这在较旧的编译器中也可以使用,但它通常工作不太好(根据我自己的经验)。
enum class some_name : uint8_t { ... };
这意味着枚举使用uint8_t
来存储这些值。如果您在用于通过网络发送数据的结构中使用枚举值,或者在需要知道数据确切大小的二进制文件中保存枚举值,则实用。
如果未指定,则类型默认为int
。
正如其他人所提出的,如果使用enum
的目的是只是来声明数字,那么使用constexpr
可能会更好。
constexpr int MY_CONSTANT_VALUE = 0;
这具有相同的效果,只有MY_CONSTANT_VALUE
的类型现在是int
。你可以更进一步,使用typedef
,如:
typedef int my_type_t;
constexpr my_type_t MY_CONSTANT_VALUE = 0;
我经常使用enum
,即使我要使用一个值,而这个值通常不被认为是整数。在这种情况下没有一成不变的规则。
简短回答:是
enum
是signed int
类型,但它们被隐式转换为unsigned int
。编译器可能会在没有显式强制转换的情况下发出警告,但它仍然非常常用。但是,您应该显式地进行强制转换,以使维护人员清楚地了解它。
当然,当它是强类型枚举时,必须显式强制转换。
最佳实践是不编写
int i = 1;
if (i > static_cast<int>(MY_ENUM_VALUE))
{
// do stuff
}
而是写入
MyEnumValue i = MY_ENUM_VALUE ;
...
if ( i > MY_ENUM_VALUE ) {..}
但是,如果在您的示例中,您的枚举中只有一个值,那么最好将其声明为常量,而不是枚举。
- C++模板函数,用于比较任何无符号整数和有符号整数
- 正在LLVM中检测整数比较条件
- 为什么:不同符号的整数比较只是偶尔发生?
- C++ 如何比较n个排序的整数向量以找到互元素?
- 比较C++中两个整数的最有效和最干净的方法是什么?
- 禁止指针和整数之间的比较C++
- ISO C++禁止指针和整数 [-fpermissive] [c++] 之间的比较
- Qsort() 比较结构体整数的总和
- 比较两个整数在C++中与未知 int 类型的相等性
- Qt 错误 iso c++ 禁止指针和整数之间的比较 -permissive
- 比较整数提升后的结果
- 对压缩整数进行加法、减法和比较
- 如何正确比较整数和浮点值
- 错误:ISO C++禁止在指针和整数 [-fallowive] 之间进行比较
- 有效比较整数列表与C++中给定的整数
- 拉链比较整数和指针之间
- C 有效比较整数序列(相对顺序)
- 关于在C/C++中比较整数和浮点/双精度
- 什么更贵?读取或比较整数,双精度
- 从控制台输入c++,比较整数