我读过你不应该相信枚举的底层实现是签名还是未签名。由此我得出结论,您应该始终将枚举值转换为与之比较的类型。像这样:
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
}
这是最佳做法吗?
编辑:如果枚举是匿名的,情况会改变吗?
原文由 khuttun 发布,翻译遵循 CC BY-SA 4.0 许可协议
一个
enum
是一个整数,因此您可以将它与任何其他整数进行比较,甚至是浮点数。在比较之前,编译器会自动将两个整数转换为最大值,或者将枚举转换为双精度数。现在,如果您的枚举本身不应该代表一个数字,您可能需要考虑创建一个类:
在这种情况下,您需要进行强制转换,因为默认情况下枚举类不被视为整数。这有助于避免错误,以防您误用枚举值…
更新: 另外,您现在可以指定
enum
的整数类型。这在较旧的编译器中也可用,但它通常不能正常工作(根据我自己的经验)。这意味着枚举使用
uint8_t
来存储这些值。如果您在用于通过网络发送数据或保存在需要知道数据确切大小的二进制文件中的结构中使用枚举值,则非常实用。未指定时,类型默认为
int
。正如其他人提出的,如果使用
enum
只是 为了声明数字,那么使用constexpr
可能会更好。这具有相同的效果,只有
MY_CONSTANT_VALUE
的类型现在是int
。您可以更进一步并使用typedef
,如下所示:我经常使用
enum
即使我要使用单个值,而该值通常不被视为整数。在这种情况下,没有一成不变的规则。