在 C 和 C 領域,術語「字串化」指的是巨集參數到字串文字的轉換。然而,這個過程可能很複雜,如以下場景所示:
#define foo 4 #define str(s) #s
在這種情況下,str(foo) 輸出“foo”,因為字串化過程(# 運算子)在宏之前執行擴充(#define 指令)。這確保 foo 仍然是一個巨集名稱,並且不會被其值取代。
但是,當以下程式碼片段會產生不同的結果:
#define xstr(s) str(s) #define str(s) #s #define foo 4
呼叫 xstr(foo) 時,輸出變成「4」。要理解這種行為,我們必須深入研究宏展開的複雜性。
根據 C 和 C 標準,巨集展開過程需要以下步驟:
對於xstr(foo) :
這裡的主要差異在於巨集參數被取代的步驟(步驟 2)。對於第一個範例中的 str(foo),步驟 2 發生在步驟 1 中套用字串化之後。因此,foo 不會被替換,輸出仍為「foo」。
為了解決此問題,使用輔助巨集 xstr。透過嵌套宏,我們可以先執行步驟2中的參數替換,然後在步驟1中套用字串化,確保獲得所需的結果「4」。
以上是宏擴展順序如何影響 C 和 C 中的字串化?的詳細內容。更多資訊請關注PHP中文網其他相關文章!