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) が見つかると、次のステップが発生します:
再帰的繰り返しマクロ
再帰的マクロのより複雑な例は、特定のコード ブロックを実行する繰り返しマクロです。指定された回数:
#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 サイトの他の関連記事を参照してください。