簡體   English   中英

這個C代碼如何工作?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM