在 C 程式設計中,將巨集遞歸地套用於巨集參數並不簡單。然而,採用複雜的解決方法,可以實現具有所需功能的 MAP 巨集。
為了啟動遞歸,我們定義一個MAP_OUT 宏,用作佔位符宏擴展:
接下來,我們建立兩個宏A和B 來示範遞歸:
計算A(blah) 會產生以下輸出:
預處理器將B(blah) 視為純文本,因為它還不是巨集調用。當此文字被重新處理時,它會擴展為產生:
透過不斷地將輸出回饋回預處理器,我們可以無限期地維持遞歸。
為了自動執行重複評估,我們使用EVAL宏:
EVAL 宏透過宏調用樹傳播其參數,將其計算計數乘以365。
為了防止無限遞歸,我們需要一個終止機制。我們定義一個名為 MAP_END 的特殊巨集:
計算時,該巨集不執行任何操作,有效地停止遞歸。
為了在遞歸巨集和終止巨集之間進行選擇,我們引入 MAP_NEXT:
MAP_NEXT 將目前項目與清單結尾標記 () 進行比較。如果符合則傳回 MAP_END,否則傳回下一個參數。
組合這些元素,我們可以建立 A 和 B 巨集的實用版本:
MAP0 和 MAP1 將操作 f 套用至目前項目 x。然後,他們檢查下一項,即 peek,以確定是繼續還是結束遞歸。
最後,我們將所有內容與頂層 MAP 巨集連結在一起:
MAP 位置參數清單上的清單結束標記並將其傳遞給 EVAL。
透過利用這些技術,您可以在 C 中實作遞歸巨集功能,啟用複雜的基於巨集的處理。
以上是儘管存在宏擴展的限制,如何在 C 中實現遞歸宏功能?的詳細內容。更多資訊請關注PHP中文網其他相關文章!