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
。
正如其他人提出的,如果使用枚举的目的仅仅是声明数字,那么使用
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
,即使我只使用单个值。在这种情况下,没有固定的规则。
MY_ENUM_VALUE
是否等同于0
呢? - Johnenum class ...
仍然只是整数。但是,尝试执行i == some_name::MY_ENUM_VALUE
会失败并出现警告(如果使用-Werror
则会出现错误)。您可以使用static_cast
在这些类型之间进行转换。但是,默认情况下(没有强制转换),它允许您更加确定在正确的位置使用了正确的类型(例如,调用一个期望some_name
的函数时,当您尝试传递0
而不是some_name::MY_ENUM_VALUE
时,编译将无法通过——您可以对0
进行强制转换,但是)。我认为这使您的代码更安全/更不容易出现错误。 - Alexis Wilke