Единственный способ объединить два токена в один (например, объединить результат вызова NAME()
и _init
) - это использовать оператор объединения (##
). Вам нужно будет сделать что-то вроде этого:
#define REAL_CONCATENATE(x, y) x ## y
#define CONCATENATE(x, y) REAL_CONCATENATE(x, y)
#define NAME() Array
inline NAME()* CONCATENATE(NAME(), _init) (void* arg0){return (NAME()*)Object_init(arg0);}
Да, необходим дополнительный уровень косвенности .
Обратите внимание, что вам не нужно использовать функциональный макрос, если вы не берете никаких параметров, так что вы можете также легко использовать:
#define NAME Array
inline NAME* CONCATENATE(NAME, _init) (void* arg0){return (NAME*)Object_init(arg0);}