2010-07-24 28 views
1
#define LINK_ENTITY_TO_CLASS(mapClassName,DLLClassName) \ 
    static CEntityFactory<DLLClassName> mapClassName(#mapClassName); 

Ceci est une macro issue du mod Alien Swarm pour Half-Life 2, destinée à être compilée avec MSVC.Argument précédé d'un # jeton dans une macro

Je n'ai jamais vu d'argument précédé d'un # dans une macro avant, et je ne suis pas sûr que ce soit une chose spécifique à MSVC ou juste inhabituel. Qu'est-ce que ça veut dire?

Répondre

6

Cela fait partie des normes C et C++ et n'est pas spécifique à l'implémentation. L'opérateur de prétraitement # stringizes son argument. Il prend tous les jetons qui ont été passés dans la macro pour le paramètre désigné par son opérande (dans ce cas, le paramètre mapClassName) et en fait une chaîne de caractères littérale. Ainsi, pour un exemple simple,

#define STRINGIZE(x) # x 

STRINGIZE(Hello World) 
// gets replaced with 
"Hello World" 

Notez que les jetons d'argument sont pas macro remplacé avant qu'ils ne soient stringized, donc si Hello ou World ont été définis comme une macro, le résultat serait toujours le même. Vous devez use an extra level of indirection pour que la macro d'arguments soit remplacée (cette réponse liée traite de l'opérateur de concaténation, ##, mais s'applique également à l'opérateur de chaînage.)

+1

Votre réponse est exacte, mais je tiens à préciser qu'il s'agit d'une partie standard de C – Swiss

+0

@Swiss: Désolé, oui: cela fait partie de la norme de langage C. –