Генерация нескольких списков из одного C X-Macro - PullRequest
0 голосов
/ 03 марта 2020

У меня есть список команд ENUM, которые могут быть либо типом запроса, либо типом ответа.

typedef enum {
     ENUM1,
     ENUM2,
     ...
} command_t;

И я планировал использовать X Macros для генерации его ENUM, а также имя Таблица соответствия строк выглядит следующим образом:

// commmands.def
X(ENUM1),
X(ENUM2),

// main.h
#define X(ENUMVAL, ...) ENUMVAL
typedef enum {
    #include "commands.def"
} myenum_e;
#undef X

#define X(ENUMVAL, NAME) {.name = NAME, .val = ENUMVAL}
name_val_map_t name_val_map_table = {
    #include "commands.def"
} mytable_t;
#undef

Кроме того, мне также нужно сгенерировать два подсписка, а именно: req_list и rsp_list. Есть ли способ, которым я могу сохранить только один файл command.def и достичь этого? Я пытался что-то вроде:

// commmands.def   
// NAME, REQ, RSP
X(ENUM1, 1, 0),
X(ENUM2, 0, 1),

// main.h
#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 X(ENUMVAL, REQ, RSP) IFCOND(REQ, case: ENUMVAL)
void _is_req(myenum_e command) {
    switch(command) {
    #include commands.def
        return 1;
    default: return 0;
    }
}
#undef X

#define X(ENUMVAL, REQ, RSP) IFCOND(RSP, case: ENUMVAL)
void _is_rsp(myenum_e command) {
    switch(command) {
    #include commands.def
        return 1;
    default: return 0;
    }
}
#undef X

Возможно ли что-то подобное? Заранее спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...