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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top