C/C の再帰マクロ : 神話か現実?
C/C には直接再帰マクロが存在しないにもかかわらず、賢い回避策が存在します再帰的な外観を実現する
遅延式と間接化を使用した再帰的マクロ エミュレーション
1 つのアプローチには、遅延式と間接化の使用が含まれます。 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/C で実現できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。