2013-03-17 2 views
1

Почему в одном случае вложенные макросы работают, а в другом нет?Вложенные макросы

Случай 1:

#define name(val) #val 
#define name2(front, back) name(front ## back) 
... 

printf("%s\n", name2(foo, bar)); // foobar 

Случай 2:

#define paste(front, back) front ## back 
#define name(val) #val 
#define name2(front, back) name(paste(front, back)) 
... 


printf("%s\n", name2(foo, bar)); // paste(foo, bar) 
+1

Вы заглянули внутрь предварительно обработанной формы, например. как полученная 'gcc -C -E' в Linux, вашей исходной программы (к которой вы могли бы добавить« промежуточный »код типа' printf («% s \ n», name (goo)) '? –

+2

Эта ссылка полезна для меня, когда вы изучаете http://gcc.gnu.org/onlinedocs/cpp/Macros.html#Macros – yuan

ответ

4

Поскольку аргументы макроса не расширены, если они появляются вместе с # или ## в теле макрокоманды (как случай с val в name). См. Принятый ответ для this question.

Итак, в вашем втором случае вам нужно добавить промежуточный шаг, чтобы обеспечить расширение аргумента. Например. что-то вроде:

#define paste(front, back) front ## back 
#define name(val) #val 
#define expand(val) name(val) // expand val before stringifying it 
#define name2(front, back) expand(paste(front, back)) 
Смежные вопросы