我有一个枚举列表:
typedef enum {
ENUM1,
ENUM2,
#if FLAG
ENUM3,
#endif
} enum_var_t;
以及要对齐的相应字符串列表:
typedef struct { char[50] name; int val; } name_val_map_t
name_val_map_t name_val_map_table[] = {
{.name="string1", .val=ENUM1},
{.name="string2", .val=ENUM2},
#if FLAG
{.name="string3", .val=ENUM3},
#endif
};
FLAG 是一个构建标志,为 0 或 1。我正在尝试使用 X-Macros 根据此处的答案对齐这些:
#define IF(cond, foo) IF_IMPL(cond, foo)
#define IF_IMPL(cond, foo) IF_ ## cond (foo)
#define IF_0(foo)
#define IF_1(foo) foo
#define var_list \
X(ENUM1, "string1"), \
X(ENUM2, "string2"), \
IF(FLAG, X(ENUM3, "string3")), \
#define X(ENUMVAL, ...) ENUMVAL
typedef enum {
var_list
}
#undef X
#define X(ENUMVAL, NAME) {.name = NAME, .val = ENUMVAL}
name_val_map_t name_val_map_table = {
var_list
}
这会导致一个错误,说我向 IF 宏传递的参数比声明的要多。我认为它将 X(ENUM3, "string3") 中的逗号视为 IF 的参数分隔符。我尝试用大括号封装 X() 调用并从 IF_IMPL 中删除大括号,但这也不起作用。如果我尝试使用 ... 和VA_ARGS扩展 IF() 中的参数列表,我会得到预期的表达式错误。我试图避免使用 def 文件,因为这会使我的文件不可读。像我尝试的一些解决方案对于避免代码复制和可读性来说是完美的。欢迎任何指点,谢谢!