2 回答

TA貢獻1846條經驗 獲得超7個贊
宏觀擴張的相關步驟是(根據C 2011 [n1570] 6.10.3.1和C ++ 1998 16.3.1):
處理前綴為
#
或的處理令牌##
。將宏替換應用于每個參數。
將每個參數替換為上述宏替換的相應結果。
重新掃描更多宏。
因此,xstr(foo)
我們有:
替換文本,
str(s)
包含no#
或##
,因此沒有任何反應。參數
foo
被替換為4
,所以就好像xstr(4)
已經被使用了一樣。在替換文本中
str(s)
,參數s
替換為4
,生成str(4)
。str(4)
重新掃描。(由此產生的步驟產生”4”
。)
請注意,問題str(foo)
在于步驟2將替換foo
為4
步驟1,它將參數更改為字符串。在步驟1中,foo
仍然是foo
; 它沒有被替換4
,所以結果是”foo”
。
這就是使用輔助宏的原因。它允許我們執行第2步,然后使用另一個宏執行第1步。

TA貢獻1895條經驗 獲得超3個贊
第一個案例
評價str(foo):替換str(foo)用#foo,即"foo"
第二種情況
評價xstr(foo):替換xstr(foo)用str(<foo-value>),即str(4)
評價str(4):替換str(4)用#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' ;
}
它會評估像
第一串
替補str(foo)有<foo-value> + 1,即4 + 1
沒有什么可以替代的。精加工。
結果是4 + 1
第二串
替補xstr(foo)有str(<foo-value>) + 1,即str(4) + 1
替補str(4)有<4-value> + 1,即4 + 1
沒有什么可以替代的。
結果是4 + 1 + 1
- 2 回答
- 0 關注
- 420 瀏覽
添加回答
舉報