2013-12-20 1 views
3

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

#define NUM     123 
#define NUM_TO_STRING1(x) #x 
#define NUM_TO_STRING(x) NUM_TO_STRING1(x) 

printf("NUM_TO_STRING1: %s\n", NUM_TO_STRING1(NUM)); 
printf("NUM_TO_STRING: %s\n", NUM_TO_STRING(NUM)); 

результат:

NUM_TO_STRING1: NUM 
NUM_TO_STRING: 123 

Почему NUM_TO_STRIN1 не может изменить NUM в строку 123?

ответ

2

См. эту ссылку:

Stringification

В конце он говорит:

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

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

и читать here о порядке сканирования АргументЪ в макросах:

Макро аргументы полностью макро вспененным, прежде чем они подставляются в тело макроса, , если они не строковые или вставленные с другие жетоны. После подстановки весь макрос, включая замещенные аргументы, снова сканируется для расширения макросов. В результате аргументы проверяются дважды, чтобы развернуть макросы.

+0

В принципе, ваш ответ - это не ответ, подходящий для SO, вы только даете ссылки и не очень объясняете. –

+0

Спасибо @JensGustedt, я обновил свой ответ. –

3

С # вы просите его не делать этого. Все # делает это stringify вещь, которая сразу же следует за ней. Идиома, что я думаю, что вы пытаетесь использовать является общим:

#define STR(_a) #_a 
#define XSTR(_a) STR(_a) 

#define BAR foo 

С вещами созданы так,

STR(BAR) 

Даст вам "BAR" и

XSTR(BAR) 

Will дать вам "foo"

+0

+1, но, чтобы сделать вещи яснее вы могли бы просто добавьте что-то вроде «так как« BAR »расшифровывается перед передачей« STR' »? –

1

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

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

С #, NUM является строковой. Есть ли быть не заменен 123.

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

123 является строковой, и результат 123

Смежные вопросы