枚举适合掩码吗?

问题描述 投票:0回答:1

由于掩码值是整数,我们可以用不同的方式表示它们。 例如,作为宏:

#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 enums macros
1个回答
0
投票

在 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标准没有这样的要求。

© www.soinside.com 2019 - 2024. All rights reserved.