在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
,则此选项将不起作用。。更新了答案