![](/img/trans.png)
[英]How to compose stringification with user defined literal (UDL) in Macro?
[英]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):
#
或##
令牌。 因此,使用xstr(foo)
,我們有:
str(s)
不包含#
或##
,因此沒有任何反應。 foo
替換為4
,因此就好像使用了xstr(4)
一樣。 str(s)
,參數s
被替換為4
,產生str(4)
。 str(4)
被重新掃描。 (結果步驟產生”4”
。) 請注意, str(foo)
的問題在於步驟1,它將foo
替換為4
,在步驟1之后,將參數更改為字符串。 在第1步中, foo
仍然是foo
; 它沒有被4
替換,所以結果就是”foo”
。
這就是使用輔助宏的原因。 它允許我們執行第2步,然后使用另一個宏執行第1步。
str(foo)
:用#foo
替換str(foo)
,即"foo"
xstr(foo)
:用str(<foo-value>)
替換xstr(foo)
str(<foo-value>)
,即str(4)
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' ;
}
它會評估像
<foo-value> + 1
替換str(foo)
,即4 + 1
結果是4 + 1
str(<foo-value>) + 1
替換xstr(foo)
,即str(4) + 1
str(4)
替換為<4-value> + 1
,即4 + 1
結果是4 + 1 + 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.