假设我有这样的代码:
#include <stdio.h>
// A numbered enum with gaps
#define COLORS(X) \
X(RED, 10) \
X(GREEN, 2) \
X(BLUE, 5) \
X(YELLOW, 7)
typedef enum {
#define XX(N, M) CLR_##N = M,
COLORS(XX)
#undef XX
} colors_e;
// This define must have the highest value of enum
#define MAX_COLOR_CODE 10
typedef struct {
char *language;
// the define is needed for array definition inside a struct
char *colors[MAX_COLOR_CODE + 1];
} color_names_t;
// The array of struct is selectively filled at compile time, hence use of enum for indexing
color_names_t color_names[] = {
{"en", {[CLR_RED] = "red", [CLR_BLUE] = "blue", [CLR_GREEN] = "green"}},
{"du", {[CLR_BLUE] = "blau", [CLR_YELLOW] = "gelb", [CLR_RED] = "rot"}},
};
/// ---- a sample usage of the defined array of structs
#define ARR_SIZE(X) (sizeof(X)/sizeof(X[0]))
int main() {
for(int lidx=0; lidx<ARR_SIZE(color_names); lidx++) {
printf("Language: %s\n", color_names[lidx].language);
for(int idx=0; idx<ARR_SIZE(color_names[0].colors); idx++) {
if(color_names[lidx].colors[idx])
printf("\t%s\n", color_names[lidx].colors[idx]);
}
}
return 0;
}
有没有办法自动计算MAX_COLOR_CODE
定义?
此代码:
打印最大值“10”。
这种方法利用您现有的 X-macro 结构,使其无需维护。当您添加/更改枚举值时,MAX_COLOR_CODE 将自动更新。无需手动跟踪或单独计算。
以下代码返回 10:
它创建一个临时数组字面量,
(char[]){[10]=0,[2]=0,[5]=0,[7]=0}
并获取其大小。数组的大小char[]
取决于数组中的最大索引。它sizeof
不会对数组进行求值,因此它只存在于编译器代码中。这对负数不起作用。但你可以对数字
#define S(a,b) [b+INT_MAX]=0,
和进行偏移COLORS(S)}) - 1 - INT_MAX
。一种简单易读的方法是创建一个
typedef union
基于 X 宏的数组,并用字符数组填充它。联合的大小对应于其中最大的项。最后一个
enum
as..._N
是一种常见的编码模式。不完全是 OP 所要求的,但考虑保持值按升序排列:
然后再添加一个
enum
添加定义数组为:
(可能需要一些宏魔法修正,但希望这个想法能够足够好地呈现。)