Question

#define LINK_ENTITY_TO_CLASS(mapClassName,DLLClassName) \
    static CEntityFactory<DLLClassName> mapClassName( #mapClassName );

C'est une macro à partir de l'Alien Swarm mod pour half-Life 2, destiné à être compilé avec MSVC.

Je n'ai jamais vu un argument précédée par une # dans une macro avant, et je ne suis pas sûr si c'est un MSVC chose en particulier ou tout simplement rare.Ça veut dire quoi?

Était-ce utile?

La solution

C'est en partie standard du C et C++ et n'est pas spécifique à l'implémentation.L' # prétraitement de l'opérateur stringizes son argument.Il prend tout ce qui les jetons ont été adoptées dans la macro pour le paramètre désigné par son opérande (dans ce cas, le paramètre mapClassName) et fait un littéral de chaîne d'eux.Ainsi, pour un exemple simple,

#define STRINGIZE(x) # x

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

Notez que l'argument des jetons pas macro remplacé avant qu'ils ne soient stringized, donc si Hello ou World ont été définis comme une macro, le résultat était toujours le même.Vous avez besoin de utilisez un niveau supplémentaire d'indirection pour obtenir les arguments de la macro remplacé (qui reliait la réponse traite de l'opérateur de concaténation, ##, mais s'applique également à la stringization de l'opérateur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top