将枚举与整数进行比较

Comparing enums to integers

本文关键字:比较 整数 枚举      更新时间:2023-10-16

我读到过,您不应该相信枚举的底层实现是有符号的还是无符号的。由此,我得出结论,您应该始终将枚举值强制转换为要与之进行比较的类型。像这样:

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,即使我要使用一个值,而这个值通常不被认为是整数。在这种情况下没有一成不变的规则。

简短回答:

enumsigned 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 ) {..}

但是,如果在您的示例中,您的枚举中只有一个值,那么最好将其声明为常量,而不是枚举。