У меня есть список перечислений:
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-макросы для выравнивания их в соответствии с ответом здесь :
#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, но это тоже не сработало. Если я попытаюсь развернуть список аргументов в IF (), используя ... и VA_ARGS , я получу ожидаемые ошибки выражения. Я пытаюсь избежать использования файла def, так как это делает мой файл нечитаемым. Такое решение, как я пытался, было бы идеальным, чтобы избежать репликации кода и для удобства чтения. Любые указатели приветствуются, спасибо!