首頁 > 後端開發 > C++ > 我們可以在 C/C 預處理中建立遞歸巨集嗎?

我們可以在 C/C 預處理中建立遞歸巨集嗎?

Barbara Streisand
發布: 2024-12-09 11:47:16
原創
207 人瀏覽過

Can We Create Recursive Macros in C/C   Preprocessing?

我們可以有遞歸巨集嗎?

雖然巨集不直接遞歸擴展,但有一些巧妙的技術可以實現類似的功能。

解決方法遞歸巨集

我們可以使用延遲表達式和間接來防止預處理器在擴充期間禁用巨集。以下是建立遞歸pr 巨集的範例:

#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) -> ((5==1)? 1 : pr_id()(4))
EXPAND(pr(5)) -> ((5==1)? 1 : ((4==1)? 1 : pr_id()(3)))
登入後複製

遞歸重複巨集的範例

使用這些技術,我們可以建立一個遞迴REPEAT宏:

#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/C 預處理中建立遞歸巨集嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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