首頁 > 後端開發 > C++ > C/C 中可以實作遞歸巨集嗎?

C/C 中可以實作遞歸巨集嗎?

Barbara Streisand
發布: 2024-12-06 09:05:12
原創
293 人瀏覽過

Can Recursive Macros Be Implemented in C/C  ?

探索 C/C 中的遞歸宏:擴展的藝術

遞歸宏是否存在?

雖然缺少宏C/C中固有的遞歸能力,但存在一條實現的路徑類似遞歸的行為。使用延遲表達式和間接定址的組合,可以建立模擬遞歸的複雜巨集。

它是如何運作的

要製作遞歸宏,我們必須擁抱多重步驟過程:

  1. 阻礙自擴展: 透過建立停用上下文來防止巨集停止其擴充。
  2. 間接: 使用間接將擴充延遲到稍後階段。
  3. 擴充:應用多次掃描來完成擴充

範例:遞歸重複宏

這是遞歸重複宏的說明:

#define REPEAT(count, macro, ...) \
    WHEN(count) \
    ( \
        OBSTRUCT(REPEAT_INDIRECT) () \
        ( \
            DEC(count), macro, __VA_ARGS__ \
        ) \
        OBSTRUCT(macro) \
        ( \
            DEC(count), __VA_ARGS__ \
        ) \
    )
登入後複製

此巨集可以是像這樣呼叫this:

EVAL(REPEAT(8, M, ~)) // Outputs: 0 1 2 3 4 5 6 7
登入後複製

範例執行問題

您提供的程式碼:

# define pr(n) ((n==1)? 1 : pr(n-1))
void main ()
{
    int a=5;
    cout<<"result: "<< pr(5) <<endl;
    getch();
}
登入後複製

由於遞歸宏問題而無法執行。 pr 宏僅依賴遞歸,導致無限擴展。

解決方案

要解決此問題,您可以使用以下巨集的非遞歸版本:

#define fact(n) ((n == 1)? 1 : n * fact(n - 1))
登入後複製

以上是C/C 中可以實作遞歸巨集嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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