簡體   English   中英

字符串化 - 它是如何工作的?

[英]Stringification - how does it work?

我知道:

#define foo 4  
#define str(s) #s

str(foo)寫出: "foo" ,因為stringify首先執行文本擴展,但是:

 #define xstr(s) str(s)
 #define str(s) #s
 #define foo 4

xstr(foo)寫道: "4"

為什么? 該過程涉及哪些步驟?

宏觀擴張的相關步驟是(根據C 2011 [n1570] 6.10.3.1和C ++ 1998 16.3.1):

  1. 處理以###令牌。
  2. 將宏替換應用於每個參數。
  3. 將每個參數替換為上述宏替換的相應結果。
  4. 重新掃描更多宏。

因此,使用xstr(foo) ,我們有:

  1. 替換文本str(s)不包含### ,因此沒有任何反應。
  2. 參數foo替換為4 ,因此就好像使用了xstr(4)一樣。
  3. 在替換文本str(s) ,參數s被替換為4 ,產生str(4)
  4. str(4)被重新掃描。 (結果步驟產生”4” 。)

請注意, str(foo)的問題在於步驟1,它將foo替換為4 ,在步驟1之后,將參數更改為字符串。 在第1步中, foo仍然是foo ; 它沒有被4替換,所以結果就是”foo”

這就是使用輔助宏的原因。 它允許我們執行第2步,然后使用另一個宏執行第1步。

第一個案例

  1. 評估str(foo) :用#foo替換str(foo) ,即"foo"

第二種情況

  1. 評估xstr(foo) :用str(<foo-value>)替換xstr(foo) str(<foo-value>) ,即str(4)
  2. 評估str(4) :用#4替換str(4) ,即"4"

通常,

預處理器評估擴展宏變量的宏函數, 直到它無需評估

如果你定義

#define xstr(s) str(s) + 1
#define str(s) s + 1

在以下代碼中

#define foo 4

int main()
{
    std::cout << str(foo) << '\n' 
              << xstr(foo) << '\n' ;

} 

它會評估像

第一串

  1. <foo-value> + 1替換str(foo) ,即4 + 1
  2. 沒有什么可以替代的。 精加工。

結果是4 + 1

第二串

  1. str(<foo-value>) + 1替換xstr(foo) ,即str(4) + 1
  2. str(4)替換為<4-value> + 1 ,即4 + 1
  3. 沒有什么可以替代的。

結果是4 + 1 + 1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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