Как при создании структуры внутри макроса сгенерировать ее имя из переданного в макрос значения?

#define EXAMPLE_MACRO(val_type, postfix) \
    struct example_struct_postfix {      \
        val_type val;                                     \
    }; 

EXAMPLE_MACRO(int, name);

Я хочу чтоб в данном примере, было сгенерировано example_struct_name, но генерируется example_struct_postfix


Ответы (2 шт):

Автор решения: Fat-Zer

Для этого есть оператор ##, который производит макрорасширение своих аргументов, а потом конкатенирует результат:

#define EXAMPLE_MACRO(val_type, postfix) \
    struct example_struct_ ## postfix {  \
        val_type val;                    \
    }; 

См. подробности в любом справочнике по языку в разделе с макросами.

→ Ссылка
Автор решения: HolyBlackCat

Вот так: example_struct_##postfix.


Если передать в качестве имени другой макрос, то будет взято имя макроса, а не его значение. Т.е.: #define A B EXAMPLE_MACRO(int, A) -> example_struct_A.

Если это мешает, то так:

#define CAT(x, y) CAT_(x, y)
#define CAT_(x, y) x##y
CAT(example_struct_, postfix)
→ Ссылка