Разницу двух определяете?
В чем разница двух define
?
#define NUM 123
#define NUM_TO_STRING1(x) #x
#define NUM_TO_STRING(x) NUM_TO_STRING1(x)
printf("NUM_TO_STRING1: %sn", NUM_TO_STRING1(NUM));
printf("NUM_TO_STRING: %sn", NUM_TO_STRING(NUM));
Результат:
NUM_TO_STRING1: NUM
NUM_TO_STRING: 123
Почему NUM_TO_STRIN1
нельзя изменить NUM
на строку 123
?
3 ответа:
Смотрите эту ссылку:
В конце он говорит:
Если вы хотите упорядочить результат расширения аргумента макроса, вам придется использовать два уровня макросов.
#define xstr(s) str(s) #define str(s) #s #define foo 4 str (foo) ==> "foo" xstr (foo) ==> xstr (4) ==> str (4) ==> "4"
И прочитайте здесь О порядке сканирования аргументов в макросах:
Аргументы макросов полностью расширяются до того, как они будут заменены в тело макросов, , если они не строкованы или не вставлены с другими маркерами . После подстановка, все тело макроса, включая подставленные аргументы, снова сканируется на предмет расширения макросов. В результате аргументы сканируются дважды для расширения вызовов макросов в них.
С
#
, Вы просите его не делать этого. Все, что делает#
, - этонанизывает то, что непосредственно следует за ним. Идиома, которую, как мне кажется, вы пытаетесь использовать, является распространенной:#define STR(_a) #_a #define XSTR(_a) STR(_a) #define BAR foo
С такими вещами, как эта,
STR(BAR)
Даст вам
"BAR"
иXSTR(BAR)
Даст вам
"foo"