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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top