C/C 中的遞歸宏
C/C 中的巨集不支援直接遞歸。但是,可以透過預處理技術和間接的組合來模擬遞歸。
類似遞歸的宏示例
以下宏使用延遲表達式模擬遞歸和間接:
#define EMPTY(...) #define DEFER(...) __VA_ARGS__ EMPTY() #define OBSTRUCT(...) __VA_ARGS__ DEFER(EMPTY)() #define EXPAND(...) __VA_ARGS__ #define pr_id() pr #define pr(n) ((n == 1) ? 1 : DEFER(pr_id)()(n - 1))
執行處理
當遇到pr(5)時,會發生以下步驟:
遞歸重複宏
類似遞歸的宏的一個更複雜的範例是重複宏,它執行特定的操作程式碼區塊指定次數:
#define REPEAT(count, macro, ...) \ WHEN(count) \ ( \ OBSTRUCT(REPEAT_INDIRECT) () \ ( \ DEC(count), macro, __VA_ARGS__ \ ) \ OBSTRUCT(macro) \ ( \ DEC(count), __VA_ARGS__ \ ) \ ) #define REPEAT_INDIRECT() REPEAT #define M(i, _) i
此宏可以如下使用:
EVAL(REPEAT(8, M, ~)) // 0 1 2 3 4 5 6 7
限制
模擬遞歸時透過巨集是可能的,但由於潛在的效能影響和程式碼可讀性問題,通常被認為是一種不好的做法。現代 C 提供了替代的遞歸機制,例如 lambda 表達式和模板元編程。
以上是如何用 C/C 宏模擬遞歸?的詳細內容。更多資訊請關注PHP中文網其他相關文章!