2013-03-17 68 views
1

爲什麼在一種情況下嵌套宏可以工作,而另一種情況下不能?C嵌套宏

情況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

您是否在預處理過的表單(例如, (Linux)上的'gcc -C -E'獲得的源程序(可以向其添加「中間」代碼,如printf(「%s \ n」,名稱(goo))'' – 2013-03-17 07:54:00

+2

此鏈接有幫助對於我學習http://gcc.gnu.org/onlinedocs/cpp/Macros.html#Macros – yuan 2013-03-17 11:11:14

回答

4

由於參數給宏沒有擴展的原樣valname中的情況)。請參閱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))