Pregunta

#define LINK_ENTITY_TO_CLASS(mapClassName,DLLClassName) \
    static CEntityFactory<DLLClassName> mapClassName( #mapClassName );

Esta es una macro del mod Alien Swarm para Half-Life 2, destinada a ser compilada con MSVC.

Nunca he visto una discusión precedida por una # en una macro antes, y no estoy seguro de si esto es algo específico de MSVC o simplemente poco común.¿Qué significa?

¿Fue útil?

Solución

Esto es parte del estándar C y C++ y no es específico de la implementación.El # El operador de preprocesamiento encadena su argumento.Toma todos los tokens que se pasaron a la macro para el parámetro designado por su operando (en este caso, el parámetro mapClassName) y convierte una cadena literal a partir de ellos.Entonces, para un ejemplo simple,

#define STRINGIZE(x) # x

STRINGIZE(Hello World)
// gets replaced with
"Hello World"

Tenga en cuenta que los tokens de argumento son no macro reemplazada antes de que se conviertan en cadenas, por lo que si Hello o World se definieran como una macro, el resultado seguiría siendo el mismo.Necesitas utilizar un nivel adicional de indirección para reemplazar la macro de argumentos (esa respuesta vinculada analiza el operador de concatenación, ##, pero se aplica igualmente al operador de encadenamiento.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top