Аргумент, которому предшествует токен # в макросе

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

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

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


person Swiss    schedule 24.07.2010    source источник


Ответы (1)


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

#define STRINGIZE(x) # x

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

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

person James McNellis    schedule 24.07.2010
comment
Ваш ответ правильный, но я просто хочу уточнить, что это стандартная часть препроцессора C, а не специфичная для MSVC вещь. - person Swiss; 24.07.2010
comment
@Swiss: извините; да: это часть стандарта языка C. - person James McNellis; 24.07.2010