Препроцессор GCC для встроенного имени метода - PullRequest
0 голосов
/ 12 июня 2010

Я работаю над проектом, в котором у меня есть код, подобный следующему:

#define NAME() Array

inline NAME()* NAME()_init (void* arg0){return (NAME()*)Object_init(arg0);}

Но я получаю следующий результат:

inline Array* Array _init (void* arg0){return (Array*)Object_init(arg0);}

С пробелом между "Массивом" и "_init" Поскольку это имя функции, я, очевидно, не хочу пробела. Кто-нибудь знает, как вывести пространство?

Ответы [ 2 ]

2 голосов
/ 12 июня 2010

Единственный способ объединить два токена в один (например, объединить результат вызова 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);}
1 голос
/ 12 июня 2010

Вы должны изменить семантику примерно так:

#define NAME(X) Array##X
inline NAME()* NAME(_init) (void* arg0){return (NAME()*)Object_init(arg0);}

РЕДАКТИРОВАТЬ : По крайней мере, это работает с GNU cpp.

EDIT2 : пробовал также с -ansi -pedantic и, похоже, он работал без предупреждения ...

...