Препроцессор Цитирование аргументов макроса - PullRequest
0 голосов
/ 02 апреля 2011

Предположим, у меня есть некоторый макрос #define NAME name, и я хочу определить другой макрос, который будет расширен до указанного в кавычках значения. То есть, как будто я также определил #define NAME_STR "name". Есть ли более аккуратный способ, чем следующий?

#define QUOT(str)   #str
#define QUOT_ARG(str)   QUOT(str)
#define NAME_STR    QUOT_ARG(NAME)

1 Ответ

2 голосов
/ 02 апреля 2011

Не совсем, из-за того, что аргументы макроса не раскрываются при использовании в строковом формате Из руководства GNU C PreProcessor :

В отличие от обычной замены параметров, аргумент не является макро-расширенным первый. Это называется строковым форматированием.

Из того же источника:

Если вы хотите привести в соответствие результат расширение макро аргумента, вы должны использовать два уровня макросов.

... который продолжает пример:

 #define xstr(s) str(s)
 #define str(s) #s
 #define foo 4
 str (foo)
      ==> "foo"
 xstr (foo)
      ==> xstr (4)
      ==> str (4)
      ==> "4"
...