在 C 中将枚举值增加固定数字

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

是否可以将枚举字段的值增加固定数量?

假设我有一个枚举

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;
c enums
3个回答
4
投票

不,该语言没有这样的支持。

当然,您可能可以使用宏做一些或多或少可怕的事情。我认为整个“自动”部分很麻烦,但是当有足够的动机时,人们可以想出最麻烦的预处理器结构。


0
投票

这是一个解决方案。即使仅定义了 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;

0
投票

枚举与

#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;
© www.soinside.com 2019 - 2024. All rights reserved.