是否可以将枚举字段的值增加固定数量?
假设我有一个枚举
typedef enum {
VAL_A,
VAL_B,
VAL_C
}ENUM_X;
我想以这样的方式定义枚举,即值可以按固定数字递增(默认值 1 除外)。这会导致我有(假设数字是 4)
VAL_A = 4; VAL_B = 8; VAL_C = 12;
另外,如果上述答案为真,并且存在任何这样的机制,是否可以使值依次递增?
假设我重新定义了与
相同的枚举typedef enum {
#ifdef A
VAL_A,
#endif
#ifdef B
VAL_B,
#endif
#ifdef C
VAL_C,
#endif
VAL_END
}ENUM_X;
如果对于上面的枚举我定义了 A 和 C,我应该得到
VAL_A = 4; VAL_C = 8;
但是如果我只定义 B 和 C,我应该得到
VAL_B = 4; VAL_C = 8;
如果我定义所有 A、B 和 C,我应该得到
VAL_A = 4; VAL_B = 8; VAL_C = 12;
不,该语言没有这样的支持。
当然,您可能可以使用宏做一些或多或少可怕的事情。我认为整个“自动”部分很麻烦,但是当有足够的动机时,人们可以想出最麻烦的预处理器结构。
这是一个解决方案。即使仅定义了 3 个枚举之一,这也将起作用。
#define INCREMENT_VALUE 4
#define VALUE 4
#define VALTEMP 4
#define INCR_OPERATION \
#undef VALTEMP \
#define VALTEMP VALUE \
#undef VALUE \
#define VALUE (VALTEMP+ INCREMENT_VALUE) \
typedef enum {
#ifdef A
VAL_A = VALUE,
INCR_OPERATION
#endif
#ifdef B
VAL_B = VALUE,
INCR_OPERATION
#endif
#ifdef C
VAL_C = VALUE,
INCR_OPERATION
#endif
VAL_END = VALUE
}ENUM_X;
枚举与
#define
非常相似。优点之一是它们使代码可读。与其在代码中散布神奇的数字,不如为数字命名。
对于编译器来说,它只会在运行过程中将名称替换为关联的数字。
没有任何这样的选项可以按固定数字“自动递增”,但您可以遵循以下方法:
#define INCREMENT_ENUM_BY_NUM 4
typedef enum {
VAL_A = 0 + INCREMENT_ENUM_BY_NUM,
VAL_B = VAL_A + INCREMENT_ENUM_BY_NUM,
VAL_C = VAL_B + INCREMENT_ENUM_BY_NUM,
}ENUM_X;
如果您的枚举值经常更改,这非常有用。但与您的第二部分
#ifdef
一样,这是不可行的,因为您必须每次都更改代码。
我们有一个案例,根据客户要求更改了一些枚举。因此,更改这些枚举、构建并交付。在那里,这个方法很有用。 但总的来说,这样更好——
typedef enum {
VAL_A = 4,
VAL_B = 8,
VAL_C = 12
}ENUM_X;