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))
雖然這種方法允許遞歸,需要多次展開才能完成遞歸。
範例:遞歸重複巨集:
以下是遞歸重複巨集的範例:
#define REPEAT(count, macro, ...) \ WHEN(count) \ ( \ OBSTRUCT(REPEAT_INDIRECT) () \ ( \ DEC(count), macro, __VA_ARGS__ \ ) \ OBSTRUCT(macro) \ ( \ DEC(count), __VA_ARGS__ \ ) \ ) #define REPEAT_INDIRECT() REPEAT
範例用法:
// An example of using the recursive repeat macro #define M(i, _) i EVAL(REPEAT(8, M, ~)) // 0 1 2 3 4 5 6 7
結論:
雖然C/C 巨集不直接支援遞歸,但可以透過諸如deferred之類的預處理器技巧來實現它表達式和自訂巨集。這些方法在巨集定義中需要遞歸功能的特殊情況下非常有用。
以上是如何使用 C/C 巨集實現遞歸功能?的詳細內容。更多資訊請關注PHP中文網其他相關文章!