能否定义通用宏检查值是否属于任意连续枚举的取值范围?
通用连续枚举有效性检查宏的实现
当然可以实现适用于所有连续枚举的有效性检查宏,但需要依赖一个简单的编码约定——给每个连续枚举添加一个哨兵成员,用来标记枚举的有效成员数量。
实现思路
对于从0开始连续赋值的枚举,有效取值范围是[0, 成员数-1]。我们可以在每个枚举的最后添加一个以_MAX结尾的成员(比如枚举名为e,就加e_MAX),这个成员的值会自动等于枚举的有效成员总数。基于这个约定,就能写出通用的检查宏。
具体实现
- 定义带哨兵成员的连续枚举:
// 示例枚举1:包含3个有效成员,e_MAX的值为3 enum e {FOO, BAR, BAZ, e_MAX}; // 示例枚举2:包含4个有效成员,color_MAX的值为4 enum color {RED, GREEN, BLUE, YELLOW, color_MAX};
- 定义通用检查宏:
#define IS_VALID_ENUM(enum_type, val) \ ((val) >= 0 && (val) < (enum_type##_MAX))
这里利用C预处理器的##操作符,将枚举类型名和_MAX拼接成哨兵成员的名字,从而获取有效成员的总数。
- 使用示例:
int x = 2; if (IS_VALID_ENUM(e, x)) { // x是枚举e的有效取值(对应BAZ) } int y = 4; if (!IS_VALID_ENUM(color, y)) { // y不是枚举color的有效取值(color的最大有效值是3,对应YELLOW) }
无额外成员的替代方案(非通用)
如果不想添加哨兵成员,标准C中没有办法自动获取枚举的最大有效值,只能为每个枚举单独编写检查宏:
// 仅适用于枚举e的检查宏 #define IS_VALID_E(val) ((val) >= 0 && (val) <= BAZ) // 仅适用于枚举color的检查宏 #define IS_VALID_COLOR(val) ((val) >= 0 && (val) <= YELLOW)
但这种方式需要为每个枚举单独定义宏,无法做到“适用于所有连续枚举”的通用性。
内容的提问来源于stack exchange,提问作者You'reNotARobot
相关产品推荐
相关产品推荐

