2012-11-26 54 views
6

我在理解printf()語句中使用宏函數調用時遇到了一個問題。來自printf語句中的宏函數調用C

我有下面的代碼:

#include<stdio.h> 
#define f(g,h) g##h 
main() 
{ 
    printf("%d",f(100,10)); 
} 

這段代碼輸出 「10010」 作爲答案。

我已經瞭解到,宏函數調用只需複製粘貼宏函數代碼來代替調用替換的參數。

因此,代碼應該是這樣的:

#include<stdio.h> 
#define f(g,h) g##h 
main() 
{ 
    printf("%d",100##10); 
} 

但是,當我與取代的宏單獨執行上面的代碼,得到了一個編譯錯誤。

那麼第一個代碼如何給出10010作爲答案,而第二個代碼給出了編譯錯誤?

+2

##只在你的#define語句內有效,除非行以'#define [你的東西在這裏]開始,否則'沒有效果',因爲'#define'指示編譯器處理那部分代碼特別。 – ActiveTrayPrntrTagDataStrDrvr

+0

###確保參數連接在一起。因此:f(100,10)被預處理器替換爲:10010 – Tomas

回答

15

預處理器級聯運算符##完成之前該宏被替換。它只能用於宏觀主體。

+0

完美。這就解釋了爲什麼第二個代碼不起作用。謝謝 –

1

運算符##對預處理器有着特殊的含義,它是一個令牌粘貼操作符,它將兩個令牌「粘合」在一起。所以在你的情況下,gh是'粘在一起,導致新的令牌 - 整數字面值10010

1

宏中有一些特殊字符,例如##,它改變了規則'簡單地替代文本'。