首頁 > 後端開發 > C++ > 為什麼類別 C 巨集擴充中 `xstr(foo)` 輸出'4”,而 `str(foo)` 輸出'foo”?

為什麼類別 C 巨集擴充中 `xstr(foo)` 輸出'4”,而 `str(foo)` 輸出'foo”?

Linda Hamilton
發布: 2024-12-28 14:30:11
原創
207 人瀏覽過

Why Does `xstr(foo)` Output

理解字串化:巨集擴展的關鍵步驟

類C 語言中的字串化概念允許您將表達式轉換為字串。了解此過程中涉及的步驟對於有效地使用巨集至關重要。

問題:輸出差異

考慮以下巨集定義:

#define foo 4
#define str(s) #s
登入後複製

當您在程式碼中使用str(foo) 時,它將輸出“foo”,因為字串化(步驟1)是在文字擴展(步驟2).

但是,如果你定義一個額外的宏:

#define xstr(s) str(s)
登入後複製

並使用xstr(foo),輸出將令人驚訝地是“ 4”。這種差異需要探索字串化過程。

宏擴展的步驟

根據C 和C 標準,宏擴展的過程涉及幾個步驟:

  1. 預處理: 前面帶有# 或## 的標記是已處理。
  2. 參數替換: 巨集應用於每個參數。
  3. 參數替換: 參數被替換為對應的巨集結果。
  4. 重新掃描:重新掃描程式碼以取得更多巨集

將步驟套用於xstr(foo)

  1. 預處理: 沒有適用的標記。
  2. 參數替換: foo 替換為4.
  3. 參數替換:在str(s)中,s4個替換,產生str( 4)。
  4. 重新掃描: str (4)重新掃描,得到輸出"4".

為什麼str(foo) 輸出"foo"

與xstr(foo) 相比,str(foo) 輸出"foo"因為:

  • 預處理:沒有字串化標記存在。
  • 參數替換:無適用。
  • 參數替換:#foo 保持不變,因為 foo 尚未替換為 4。
  • 重新掃描: #foo 未重新掃描,產生"foo"。

因此,使用 xstr 這樣的輔助巨集可確保在字串化(步驟 1)之前執行文字擴充(步驟 2),從而實現正確的字串轉換。

以上是為什麼類別 C 巨集擴充中 `xstr(foo)` 輸出'4”,而 `str(foo)` 輸出'foo”?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板