由于掩码值是整数,我们可以用不同的方式表示它们。 例如,作为宏:
#define ENABLE_FEATURE_A 0x1
#define ENABLE_FEATURE_B 0x2
#define ENABLE_FEATURE_C 0x4
#define ENABLE_FEATURE_D 0x8
或枚举:
typedef enum {
FEATURE_A = 0x1,
FEATURE_B = 0x2,
FEATURE_C = 0x4,
FEATURE_D = 0x8
} enabled_features_t
我认为枚举表示不适合掩码,因为掩码旨在组合(通过按位运算)。 C 要求将枚举强制转换为 int,因为我们不希望对可能没有意义的数字执行操作。 所以我认为使用宏更适合标志。 我是不是想太多了?
在 C 中,枚举的“成员”是
int
类型的枚举常量,根据 C 2018 6.2.1 1:
…枚举的成员称为 枚举常量…
和2018年6.4.4.3 2:
声明为枚举常量的标识符具有类型
。int
枚举类型本身可能有其他类型,根据 C 6.7.2.2 4:
每个枚举类型应与
、有符号整数类型或无符号整数类型兼容。类型的选择是实现定义的,…char
我认为枚举表示不适合掩码,因为掩码旨在组合(通过按位运算)。
由于枚举成员是
int
值,因此它们可以作为 int
值进行操作。按位运算对它们的作用与对其他 int
值的作用一样。
由于 C 标准如何定义或不定义涉及有符号类型中符号位的计算的问题,通常首选使用带有按位运算的无符号类型。除此之外,可以使用
int
值作为位掩码。
C 要求将枚举转换为 int,因为我们不希望对可能没有意义的数字执行操作。
C标准没有这样的要求。