在C中按固定数字递增枚举值
是否可以将枚举的字段值递增一个固定数字 如果我有一个枚举在C中按固定数字递增枚举值,c,enums,C,Enums,是否可以将枚举的字段值递增一个固定数字 如果我有一个枚举 typedef enum { VAL_A, VAL_B, VAL_C }ENUM_X; 我希望以这样一种方式定义枚举,即值可以以固定的数字递增(默认值为1除外)。这将导致我有(假设数字是4) 此外,如果上述答案为真,并且存在任何此类机制,是否可以使值按顺序递增 假设我重新定义的枚举与 typedef enum { #ifdef A VAL_A, #endif #ifdef B
typedef enum {
VAL_A,
VAL_B,
VAL_C
}ENUM_X;
我希望以这样一种方式定义枚举,即值可以以固定的数字递增(默认值为1除外)。这将导致我有(假设数字是4)
此外,如果上述答案为真,并且存在任何此类机制,是否可以使值按顺序递增
假设我重新定义的枚举与
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;
VAL_B = 4; VAL_C = 8;
VAL_A = 4; VAL_B = 8; VAL_C = 12;
但是如果我只定义B和C,我应该得到
VAL_A = 4; VAL_C = 8;
VAL_B = 4; VAL_C = 8;
VAL_A = 4; VAL_B = 8; VAL_C = 12;
如果我定义了所有的A,B和C,我应该得到
VAL_A = 4; VAL_C = 8;
VAL_B = 4; VAL_C = 8;
VAL_A = 4; VAL_B = 8; VAL_C = 12;
不,语言中没有这样的支持
当然,你可以用宏做一些或多或少可怕的事情。我认为整个“自动”部分很麻烦,但是如果有足够的动力,人们可以提出最麻烦的预处理器构造。不,语言中没有这种支持
当然,你可以用宏做一些或多或少可怕的事情。我认为整个“自动”部分很麻烦,但如果有足够的动力,人们可以提出最麻烦的预处理器结构。枚举与
#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
的第二部分一样,这是不可行的,因为您每次都必须更改代码
我们有一个案例,其中一些枚举是根据客户要求更改的。因此,更改这些枚举、构建和交付。在那里,这个方法很有用。
但总的来说,这更好--
枚举非常类似于
#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
的第二部分一样,这是不可行的,因为您每次都必须更改代码
我们有一个案例,其中一些枚举是根据客户要求更改的。因此,更改这些枚举、构建和交付。在那里,这个方法很有用。
但总的来说,这更好--
这里有一个解决方案。即使只定义了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;
这里有一个解决方案。即使只定义了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;
如果我们想一种方法来实现这一点,它将比自己写出数字更复杂。C没有自定义的枚举值步进。它要么是加1,要么是你显式设置的任何值。如果我们想一种方法来实现这一点,它将比自己写出数字更复杂。C没有枚举值的自定义步进。它可以是加1,也可以是您显式设置的任何值。如果
或VALB
被\ifdef
@RishikeshRaje Yes>删除,则这将不起作用。。更新了应答如果#ifdef
@rishikshraje Yes删除VALA
或VALB
,则此选项将不起作用。。更新了答案