是否有一个编译器属性来递减枚举列表值/枚举常量(在C中)?

wi3ka0sx  于 2023-01-29  发布在  其他
关注(0)|答案(1)|浏览(102)

当你声明一个枚举时,枚举列表的常量值会自动增加。

typedef enum{
 TEST0 = 0,
 TEST_X, // automatically will be 1
 TEST_Y, // ...will be 2
...
}test_t;

有没有办法让枚举常量的值减少而不是增加?例如,在类型定义之前使用attribute指令或其他解决方案?
所以我想要的行为:

typedef enum{
 TEST0 = 0,
 TEST_X, // want to be -1
 TEST_Y, // want to be -2
...
}test_t;

我想到的唯一技巧/解决方法是:

typedef enum{
 TEST_LOWEST = -2000,
 TEST_X, //-1999
 TEST_Y, //-1998
...
 TEST0 = 0,
}test_t;

我没有找到一个属性,但也许有另一个解决方案。但上面描述的变通方案确实也有效。

oxiaedzo

oxiaedzo1#

在纯C语言中没有办法做到这一点。我不知道有任何编译器扩展允许这样做。作为一种解决方案,您可以使用一个通过__LINE__宏访问的行号,并从一开始就减去它,以实现所需的行为。

#include <stdio.h>

enum {
    START = 42 + 1 + __LINE__,
    ENUM0 = START - __LINE__,
    ENUM1 = START - __LINE__,
    ENUM2 = START - __LINE__,
};

int main(void) {
    printf("%d %d %d", ENUM0, ENUM1, ENUM2);
}

印刷品:

42 41 40

更安全的替代方法是使用GCC/CLANG中的__COUNTER__宏。每当__COUNTER__宏被展开时,该宏返回一个递增的整数。

相关问题