C++ 在C+;中使用enum进行面向整数位的操作+;可靠/安全?
考虑以下(简化)代码:C++ 在C+;中使用enum进行面向整数位的操作+;可靠/安全?,c++,enums,bit-manipulation,reliability,C++,Enums,Bit Manipulation,Reliability,考虑以下(简化)代码: enum eTestMode { TM_BASIC=1,//1没有问题。您甚至可以使用eTestMode变量(并为该类型定义位操作),因为它保证在这种情况下保存所有可能的值。我看不出这种设计有什么不好的地方 但是,请记住,enum类型可以包含未指定的值。根据使用函数的用户,您可能需要首先检查tsm的值是否为有效的枚举值 由于enum是整数值,因此可以执行以下操作: eTestMode tsm = static_cast<eTestMode>(17); // W
enum eTestMode
{
TM_BASIC=1,//1没有问题。您甚至可以使用eTestMode变量(并为该类型定义位操作),因为它保证在这种情况下保存所有可能的值。我看不出这种设计有什么不好的地方
但是,请记住,enum
类型可以包含未指定的值。根据使用函数的用户,您可能需要首先检查tsm
的值是否为有效的枚举值
由于enum
是整数值,因此可以执行以下操作:
eTestMode tsm = static_cast<eTestMode>(17); // We consider here that 17 is not a valid value for your enumeration.
<代码> ESTMODE TSM=STATICEQUAL CAST(17);//我们在这里考虑17不是枚举的有效值。
但是,这样做是丑陋的,你可能会认为这样做会导致未定义的行为。
对于某些编译器(例如VC++),可以使用此非标准宽度说明符: enum eTestMode : unsigned __int32 { TM_BASIC = 1, // 1 << 0 TM_ADV_1 = 1 << 1, TM_ADV_2 = 1 << 2 }; 枚举eTestMode:无符号uu int32 {
TM_BASIC=1,//1使用枚举表示位模式、掩码和标志并不总是一个好主意,因为枚举通常升级为有符号整数类型,而对于基于位的操作,无符号类型几乎总是首选的 enum eTestMode : unsigned __int32 { TM_BASIC = 1, // 1 << 0 TM_ADV_1 = 1 << 1, TM_ADV_2 = 1 << 2 };