Reputation: 3375
I'm working on a project where I have code like the following:
#define NAME() Array
inline NAME()* NAME()_init (void* arg0){return (NAME()*)Object_init(arg0);}
But I get the following result:
inline Array* Array _init (void* arg0){return (Array*)Object_init(arg0);}
With a space between the "Array" and the "_init" Because this is a function name, I obviously do not want the space. Does anyone know how to get the space out?
Upvotes: 0
Views: 462
Reputation: 9681
You should change the semantics in something like this:
#define NAME(X) Array##X
inline NAME()* NAME(_init) (void* arg0){return (NAME()*)Object_init(arg0);}
EDIT: At least it works with GNU cpp.
EDIT2: tried also with -ansi -pedantic
and it seemed to work without warning...
Upvotes: 1
Reputation: 355297
The only way to combine two tokens into one (e.g., to combine the result of invoking NAME()
and _init
) is to use the concatenation operator (##
). You'll need to do something like so:
#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);}
Yes, the extra level of indirection is necessary.
Note that you don't need to use a function-like macro if you take no parameters, so you could just as easily use:
#define NAME Array
inline NAME* CONCATENATE(NAME, _init) (void* arg0){return (NAME*)Object_init(arg0);}
Upvotes: 2