Вопрос

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

Это макрос из мода Alien Swarm для Half-Life 2, предназначенный для компиляции с помощью MSVC.

Я никогда не видел, чтобы аргументу предшествовал # в предыдущем макросе, и я не уверен, является ли это специфичной вещью MSVC или просто необычной.Что это значит?

Это было полезно?

Решение

Это часть как стандартного C, так и C ++ и не зависит от конкретной реализации.Тот Самый # оператор предварительной обработки строит свой аргумент в строку.Он принимает все токены, которые были переданы в макрос для параметра, обозначенного его операндом (в данном случае параметр mapClassName) и создает из них строковый литерал.Итак, для простого примера,

#define STRINGIZE(x) # x

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

Обратите внимание, что маркерами аргумента являются нет макрос заменяется до того, как они будут структурированы, поэтому, если Hello или World если бы они были определены как макрос, результат все равно был бы тем же.Тебе нужно используйте дополнительный уровень косвенности чтобы заменить макрос аргументов (в этом связанном ответе обсуждается оператор конкатенации, ##, но в равной степени применяется и к оператору stringization.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top