2010-08-08 18 views
0

Mon problème est assez simple. Je veux la macro suivanteConcaténation d'un mot clé et d'un argument de macro spécifique à qt avec un espace entre

#define PROXYPASS(name, param) \ 
void MyClass::sl_name(param _param) { \ 
    emit name(_param); \ 
} 

pour étendre PROXYPASS(clientAdded, Client*) à:

void MyClass::sl_clientAdded(Client* _param) { \ 
    emit clientAdded(_param); \ 
} 

mais comme il ne fonctionne pas dire qu'elle montre encore juste sl_name au lieu de sl_clientAdded. Alors, voici ce que je utilise:

#define PROXYPASS(name, param) \ 
void MyClass::sl_ ## name(param _param) { \ 
    emit ## name(_param); \ 
} 

Il fonctionne très bien, autre que le fait qu'il se dilate à:

void MyClass::sl_clientAdded(Client* _param) { \ 
    emitclientAdded(_param); \ 
} 

Tout est bien autre que le fait qu'il n'y a pas d'espace entre emit et clientAdded c'est-à-dire qu'il s'étend à emitclientAdded au lieu de emit clientAdded. Alors, comment vais-je le faire? Est-il possible d'ajouter des espaces ou dois-je chercher un autre moyen? Beaucoup de googling a eu mes espoirs en raison de la déclaration suivante: Si [gcc pré-processeur] met des espaces blancs entre les jetons est indéfini.

Mes autres tentatives infructueuses comprennent

emit ## ## name(_param); 
emit ## /* */ ## name(_param); 
emit ## \ ## name(_param); 
emit /* */ ## name(_param); 
emit ## space ## name(_param); [#define space \ ] 

Toute aide est grandement appréciée.

REMARQUE: La sortie du préprocesseur et la macro-expansion ont été vérifiées à l'aide de gcc -E myclass.cpp.

Répondre

0

, vous n'avez pas besoin Il suffit de mettre là rien à concaténer quoi que ce soit:

#define PROXYPASS(name, param) \ 
void MyClass::sl_ ## name(param _param) { \ 
    emit name(_param); \ 
} 
+0

'nom émettre (de _param)' 'seulement étend clientAdded (_param);'. Pour une raison étrange, le mot-clé 'emit' est simplement englouti. Je pense que c'est parce que ce n'est pas standard en C++, parce que si je le change en 'int name (_param)', il se développe correctement avec 'int clientAdded (_param);'. Je pense que c'est parce que «émettre» en soi est une macro. –

+0

Oui, c'est exactement ainsi. Le mot-clé 'emit' ne se transforme en rien, il n'a aucune signification réelle. Les signaux de Qt se comportent comme, et sont en fait des fonctions, et peuvent être appelés sans 'emit'. – jpalecek

+0

oui, "émettre" est juste du sucre syntaxique. –