Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+;中使用enum进行面向整数位的操作+;可靠/安全?_C++_Enums_Bit Manipulation_Reliability - Fatal编程技术网

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 };