2010-01-08 68 views
7

我有一個ç以下程序:##對於C(C++)預處理器有什麼意義?

#define f(g,g2) g##g2 
main() 
{ 
int var12=100; 
printf("%d",f(var,12)); 
} 

當我運行只是它擴展了這個預處理器作爲

{ 
int var12=100; 
printf("%d",var12); 
} 

這就是爲什麼輸出爲100

燦有人告訴我預處理器如何/爲什麼擴展var##12 to var12

+6

因爲這就是'##'在C預處理器中的含義。這就像說「爲什麼'我++'增加'我'?」。因爲C標準是這樣說的! – 2010-01-08 06:19:41

+0

-1明顯的功課。 – richo 2010-01-08 06:27:30

+2

@Richo ....它不是家庭作業。因爲我對預處理器不太瞭解,所以我在腦海裏有這個問題。對你來說可能很容易,而且可能看起來像一個家庭作業。但對於那些' nt知道這不是很容易理解。 – Vijay 2010-01-08 06:43:33

回答

4

,因爲##是C預處理器令牌連接運算符。

或者我可能不明白這個問題。

+1

谷歌和SO搜索失敗當然,它連接的是令牌,而不是字符串。 – 2010-01-08 13:37:46

3

##Token Pasting Operator

的雙數符號或「標記粘貼」操作符(##),其有時被稱爲「合併」運算符,在兩個對象狀和功能中使用的像宏。它允許單獨的令牌被加入到單個令牌中,因此不能成爲宏定義中的第一個或最後一個令牌。

如果宏定義中的形式參數在標記粘貼操作符之前或之後,則形式參數立即被未擴展的實際參數替換。在替換之前,宏觀擴展不會在參數上執行。

1

#define f(g,g2) g##g2

##被usued來連接在C-預處理兩個宏。 所以在編譯f(var,12)之前應該用var12替換預處理器,因此你得到了輸出。