Argumento precedido por um # token em uma macro
-
28-09-2020 - |
Pergunta
#define LINK_ENTITY_TO_CLASS(mapClassName,DLLClassName) \
static CEntityFactory<DLLClassName> mapClassName( #mapClassName );
Esta é uma macro do mod Alien Swarm para Half-Life 2, destinada a ser compilada com MSVC.
Nunca vi uma discussão precedida por um #
em uma macro antes, e não tenho certeza se isso é algo específico do MSVC ou apenas incomum.O que isso significa?
Solução
Isso faz parte do C padrão e do C++ e não é específico da implementação.O #
O operador de pré-processamento restringe seu argumento.São necessários quaisquer tokens que foram passados para a macro para o parâmetro designado por seu operando (neste caso, o parâmetro mapClassName
) e transforma-os em uma string literal.Então, para um exemplo simples,
#define STRINGIZE(x) # x
STRINGIZE(Hello World)
// gets replaced with
"Hello World"
Observe que os tokens de argumento são não macro substituída antes de serem stringizadas, então se Hello
ou World
foram definidos como uma macro, o resultado ainda seria o mesmo.Você precisa use um nível extra de indireção para substituir a macro de argumentos (essa resposta vinculada discute o operador de concatenação, ##
, mas se aplica igualmente ao operador de stringização.