【发布时间】:2020-03-02 07:50:00
【问题描述】:
我有一个枚举列表:
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 根据答案 here 对齐这些:
#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 文件,因为这会使我的文件不可读。像我尝试的一些解决方案对于避免代码复制和可读性来说是完美的。欢迎大家指点,谢谢!
【问题讨论】:
-
X是什么?FLAG是什么?请附上一个minimal, reproducible example,说明您的问题中的问题。 -
X对于任何事情来说都是一个非常糟糕的名字。当其他人看到它时,他们不会知道X的含义或它的作用,而无需挖掘其实际实现。而那个“其他人”包括未来的你。
标签: c conditional-statements x-macros