ホームページ >バックエンド開発 >C++ >C/C マクロを使用して再帰をエミュレートするにはどうすればよいですか?

C/C マクロを使用して再帰をエミュレートするにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-07 08:53:11993ブラウズ

How Can Recursion Be Emulated with C/C   Macros?

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))

実行プロセス

pr(5) が見つかると、次のステップが発生します:

  1. pr(5) は ((5 == 1) ? 1 : DEFER( pr_id)()(5 - 1)).
  2. プリプロセッサは pr(5) を青に塗ります (無効化)
  3. DEFER(pr_id)()(5 - 1) は OBSTRUCT(pr_id)()(5 - 1) になり、pr_id () は青く塗られます。
  4. EXPAND(pr(5)) は ((5 == 1) ? 1 : ((5 - 1 == 1) ? 1 に展開されます) : DEFER(pr_id)()(5 - 1 - 1)))
  5. 再帰を完了するには追加の展開が必要です。

再帰的繰り返しマクロ

再帰的マクロのより複雑な例は、特定のコード ブロックを実行する繰り返しマクロです。指定された回数:

#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/C マクロを使用して再帰をエミュレートするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。