首頁 > 後端開發 > C++ > 如何用 C/C 宏模擬遞歸?

如何用 C/C 宏模擬遞歸?

Linda Hamilton
發布: 2024-12-07 08:53:11
原創
998 人瀏覽過

How Can Recursion Be Emulated with C/C   Macros?

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)時,會發生以下步驟:

  1. pr(5) 展開為((5 == 1) ? 1 : DEFER( pr_id)()(5 - 1)).
  2. 預處理器將pr(5) 繪製為藍色(禁用context),防止其進一步擴展。
  3. DEFER(pr_id)()(5 - 1) 變成 OBSTRUCT(pr_id)()(5 - 1) 並且 pr_id () 被塗成藍色。
  4. EXPAND(pr(5)) 展開為((5 == 1) ? 1 : ((5 - 1 == 1) ? 1 : DEFER(pr_id)()(5 - 1 - 1) ))
  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中文網其他相關文章!

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