2 回答

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

TA貢獻(xiàn)1895條經(jīng)驗(yàn) 獲得超3個(gè)贊
第一個(gè)案例
評價(jià)str(foo):替換str(foo)用#foo,即"foo"
第二種情況
評價(jià)xstr(foo):替換xstr(foo)用str(<foo-value>),即str(4)
評價(jià)str(4):替換str(4)用#4,即"4"
通常,
預(yù)處理器評估擴(kuò)展宏變量的宏函數(shù),直到它無需評估:
如果你定義
#define xstr(s) str(s) + 1
#define str(s) s + 1
在以下代碼中
#define foo 4
int main()
{
std::cout << str(foo) << '\n'
<< xstr(foo) << '\n' ;
}
它會(huì)評估像
第一串
替補(bǔ)str(foo)有<foo-value> + 1,即4 + 1
沒有什么可以替代的。精加工。
結(jié)果是4 + 1
第二串
替補(bǔ)xstr(foo)有str(<foo-value>) + 1,即str(4) + 1
替補(bǔ)str(4)有<4-value> + 1,即4 + 1
沒有什么可以替代的。
結(jié)果是4 + 1 + 1
- 2 回答
- 0 關(guān)注
- 419 瀏覽
添加回答
舉報(bào)