首頁 >後端開發 >C++ >為什麼字串化在一種情況下產生'foo”,在另一種情況下產生'4”?

為什麼字串化在一種情況下產生'foo”,在另一種情況下產生'4”?

Linda Hamilton
Linda Hamilton原創
2024-12-24 04:20:10914瀏覽

Why Does Stringification Produce

字串化揭秘:分步說明

字串化是一種強大的宏技術,可將給定標記轉換為字串文字。為了理解它的複雜性,讓我們檢查以下場景:

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」。為了解決這個差異,我們深入研究宏擴展中涉及的具體步驟:

  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 仍然是foo (未替換為4) .
  2. 替換文字#s產生"foo."

問題的關鍵在於執行順序。在步驟 1 中,當計算 str(foo) 時,foo 尚未被 4 取代。因此,字串化步驟結果為“foo”。

因此,使用像 xstr 這樣的輔助巨集可以單獨執行步驟 2 和 1,最終提供所需的字串化行為。

以上是為什麼字串化在一種情況下產生'foo”,在另一種情況下產生'4”?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn