Argomento preceduto da un token # in una macro
-
28-09-2020 - |
Domanda
#define LINK_ENTITY_TO_CLASS(mapClassName,DLLClassName) \
static CEntityFactory<DLLClassName> mapClassName( #mapClassName );
.
Si tratta di una macro dallo sciame alieno mod per la mezza vita 2, pensata per essere compilata con MSVC.
Non ho mai visto un argomento preceduto da un #
in una macro prima, e non sono sicuro se questa è una cosa specifica di MSVC o semplicemente non comune.Cosa significa?
Soluzione
Questo fa parte dello standard C e C ++ e non è specifico per l'implementazione.L'operatore di pre-elaborazione #
che stringe il suo argomento.Ci vogliono che i carini siano stati trasmessi nella macro per il parametro designato dal suo operando (in questo caso, il parametro mapClassName
) e rende una stringa letterale da esse.Quindi, per un semplice esempio,
#define STRINGIZE(x) # x
STRINGIZE(Hello World)
// gets replaced with
"Hello World"
.
Si noti che i token degli argomenti sono non la macro sostituita prima che vengano rigorosi, quindi se Hello
o World
è stato definito come una macro, il risultato sarebbe comunque lo stesso.È necessario Utilizzare un livello aggiuntivo di indirezione per ottenere gli argomenti a macro sostituiti (Quella risposta collegata discute l'operatore di concatenazione, ##
, ma si applica allo stesso modo all'operatore di rigetto.