[英]How does this C code work?
什么是a##b
& #a
?
#define f(a,b) a##b
#define g(a) #a
#define h(a) g(a)
main()
{
printf("%s\n",h(f(1,2))); //how should I interpret this?? [line 1]
printf("%s\n",g(f(1,2))); //and this? [line 2]
}
這個程序如何運作?
輸出是
12
f(1, 2)
現在我明白a##b
& #a
如何工作的。 但為什么兩種情況(第1行和第2行)的結果不同?
##將兩個令牌連接在一起。 它只能在預處理器中使用。
f(1,2)
變為1 ## 2
變為12
。
#運算符本身會對標記進行字符串化處理 : #a
變為"a"
。 因此,當預處理器完成時, g(f(1,2))
變為"f(1,2)"
。
h(f(1,2))
實際上是#(1 ## 2)
,它變為#12
,當預處理器在其上運行時變為"12"
。
對於像這樣的問題(以及與預處理器有關的更多“現實世界”問題),我發現在預處理之后實際讀取代碼非常有幫助。
如何做到這一點因編譯器而異,但是使用gcc,你會使用這個:
$ gcc -E test.c
(snip)
main()
{
printf("%s\n","12");
printf("%s\n","f(1,2)");
}
因此,您可以看到符號已連接在一起,並轉換為字符串。
## b將粘貼代碼togather。
所以f(1,2)將變為12
f(a,b)宏連接其參數,g(a)將其參數轉換為字符串,h(a)是g(a)的輔助宏。 我認為它會輸出:
12
f(1,2)
原因是h(a)宏使其參數在將其傳遞給g(a)之前完全展開,而g(a)將逐字地獲取其參數而不首先擴展它們。
a ## b是文字a和b的字符串連接,所以f(1,2)是“12”
#a是字符串文字a,所以g(3)是“3”
##是宏連接運算符。 所以例如f(foo,bar)
相當於foobar
。
#define f(a,b) a##b #define g(a) #a #define h(a) g(a)
所以,##將兩個部分直接組合在一起,無論它們是什么類型......給你一個例子.. printf("%d\\n",f(1,2));
你得到12,這意味着這里f(1,2)是12整數。
int a2 = 100; printf("%d\n",f(a,2));
這里f(a,2)是標簽。 它指向代碼上下文中的標簽,如果沒有int a2 = 100
,則會出現編譯錯誤。 並且#a
將任何東西變成一個字符串...然后h(a) g(a)
這很奇怪..看起來當你調用h(a)時,它轉向g(a),並且通過a到g(a),首先,它解釋了什么是a。 所以,在你可以g(a)之前,a被轉換為f(a,b)= a ## b = 12
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.