Разницу двух определяете?


В чем разница двух 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 3

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"

В вашем случае:

NUM_TO_STRING1 (NUM) становится NUM

С #, NUM строится. Не заменяется на 123.

NUM_TO_STRING (NUM) становится NUM_TO_STRING1 (123)

123 строится, и в результате получается 123