亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

C++ C
炎炎設計 2019-09-02 08:56:45
我知道:#define foo 4  #define str(s) #s與str(foo)寫出:"foo"因為字符串化的第一個文本擴展的執行,但這樣的: #define xstr(s) str(s) #define str(s) #s #define foo 4與xstr(foo)寫出:"4"。為什么?該過程涉及哪些步驟?
查看完整描述

2 回答

?
喵喵時光機

TA貢獻1846條經驗 獲得超7個贊

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

  1. 處理前綴為#或的處理令牌##。

  2. 將宏替換應用于每個參數。

  3. 將每個參數替換為上述宏替換的相應結果。

  4. 重新掃描更多宏。

因此,xstr(foo)我們有:

  1. 替換文本,str(s)包含no ###,因此沒有任何反應。

  2. 參數foo被替換為4,所以就好像xstr(4)已經被使用了一樣。

  3. 在替換文本中str(s),參數s替換為4,生成str(4)。

  4. str(4)重新掃描。(由此產生的步驟產生”4”。)

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

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


查看完整回答
反對 回復 2019-09-02
?
蠱毒傳說

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


查看完整回答
反對 回復 2019-09-02
  • 2 回答
  • 0 關注
  • 420 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號