Разницу двух определяете?
В чем разница двух 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"