2010-06-12 5 views
0

Je travaille sur un projet où j'ai le code comme suit:GCC préprocesseur pour le nom de la méthode en ligne

#define NAME() Array 

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

Mais je reçois le résultat suivant:

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

Avec un espace entre la "Array" et le "_init" Parce que c'est un nom de fonction, je ne veux évidemment pas l'espace. Est-ce que quelqu'un sait comment faire sortir l'espace?

Répondre

1

Vous devez changer la sémantique dans quelque chose comme ceci:

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

EDIT: Au moins il fonctionne avec cpp GNU.

EDIT2: a également essayé avec -ansi -pedantic et il semblait fonctionner sans crier gare ...

+0

il pourrait être, mais l'OP spécifié préprocesseur GNU, et J'ai testé avec – ShinTakezou

+0

Désolé; mon erreur. C99 a ajouté le support pour les arguments vides. –

2

La seule façon de combiner deux jetons en un seul (par exemple, de combiner le résultat d'invoquer NAME() et _init) est à utilisez l'opérateur de concaténation (##). Vous devrez faire quelque chose comme ceci:

#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);} 

Oui, the extra level of indirection is necessary.

Notez que vous n'avez pas besoin d'utiliser une macro fonction comme si vous prenez pas de paramètres, vous pouvez aussi utiliser facilement:

#define NAME Array 
inline NAME* CONCATENATE(NAME, _init) (void* arg0){return (NAME*)Object_init(arg0);} 
+0

On l'appelle le collage de jetons plutôt que la concaténation - la concaténation de chaîne se produit après la segmentation, le collage avant et ne nécessite aucun opérateur. –

+0

@Pete: Les deux standards de langage C et C++ utilisent le mot _concatenate; _ cela ne signifie pas que _token concatenation_ est la même chose que _string literal concatenation_ (ou toute autre forme de concaténation, d'ailleurs). –

Questions connexes