雖然巨集不直接遞歸擴展,但有一些巧妙的技術可以實現類似的功能。
我們可以使用延遲表達式和間接來防止預處理器在擴充期間禁用巨集。以下是建立遞歸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中文網其他相關文章!