Argument, dem ein #-Token in einem Makro vorangestellt ist
-
28-09-2020 - |
Frage
#define LINK_ENTITY_TO_CLASS(mapClassName,DLLClassName) \
static CEntityFactory<DLLClassName> mapClassName( #mapClassName );
Dies ist ein Makro aus dem Alien Swarm-Mod für Half-Life 2, das mit MSVC kompiliert werden soll.
Ich habe noch nie ein Argument gesehen, dem ein vorangegangen ist #
in einem Makro zuvor, und ich bin mir nicht sicher, ob dies eine MSVC-spezifische Sache ist oder einfach nur ungewöhnlich.Was bedeutet das?
Lösung
Dies ist Teil von Standard-C und C++ und nicht implementierungsspezifisch.Der #
Der Vorverarbeitungsoperator stringisiert sein Argument.Es benötigt alle Token, die an das Makro für den durch seinen Operanden angegebenen Parameter (in diesem Fall den Parameter) übergeben wurden mapClassName
) und macht daraus ein String-Literal.Also, für ein einfaches Beispiel,
#define STRINGIZE(x) # x
STRINGIZE(Hello World)
// gets replaced with
"Hello World"
Beachten Sie, dass es sich bei den Argumenttoken um Folgendes handelt nicht Makro ersetzt, bevor sie stringisiert werden, also wenn Hello
oder World
als Makro definiert wurden, wäre das Ergebnis immer noch dasselbe.Du brauchst Verwenden Sie eine zusätzliche Indirektionsebene um das Argumentmakro zu ersetzen (diese verknüpfte Antwort behandelt den Verkettungsoperator, ##
, gilt aber gleichermaßen für den Stringisierungsoperator.