C/C 中的遞歸宏:神話還是現實?
儘管C/C 中沒有直接遞歸宏,但存在巧妙的解決方法達到類似遞歸的效果
使用延遲表達式和間接的遞歸宏模擬
一種方法涉及使用延遲表達式和間接。透過使用 DEFER 和 EMPTY 宏,我們可以推遲對宏的評估,並防止它被預處理器塗成藍色。這規避了遞歸擴展限制。
例如,考慮以下宏:
#define pr_id() pr #define pr(n) ((n==1)? 1 : DEFER(pr_id)()(n-1))
利用這個宏,我們得到了以迂迴方式遞歸呼叫 pr(n) 的能力。然而,這種技術需要多次預處理器掃描才能完成擴展。
透過表達式求值的遞歸宏
另一種方法涉及利用一系列表達式求值宏,例如 EVAL1 EVAL5,模擬遞歸行為。
例如,要定義一個遞歸重複宏,我們可以利用以下語法:
#define REPEAT(count, macro, ...) \ WHEN(count) \ ( \ OBSTRUCT(REPEAT_INDIRECT) () \ ( \ DEC(count), macro, __VA_ARGS__ \ ) \ OBSTRUCT(macro) \ ( \ DEC(count), __VA_ARGS__ \ ) \ )
透過應用多個擴展,我們可以實現類似遞歸的行為,如以下程式碼所示:
EVAL(REPEAT(8, M, ~)) // Output: 0 1 2 3 4 5 6 7
程式碼執行問題
由於cout物件使用不當,您問題中提到的程式碼將不會執行。正確的語法應該是:
cout << "result: " << pr(5) << endl;
替換
替換和>帶有以上是C/C中可以實作遞歸巨集嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!