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

时间:2016-10-26 10:25:53

标签: c enums

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

说我是否有枚举

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 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分: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的第二部分一样,这是不可行的,因为每次都必须更改代码。

我们有一个案例,根据客户要求更改了一些枚举。所以改变那些枚举,构建和交付。在那里,这个apporach是有用的。 但总的来说,这更好 -

typedef enum {
    VAL_A = 4,
    VAL_B = 8,
    VAL_C = 12
}ENUM_X;

答案 2 :(得分: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;