C プログラミングでは、マクロ引数にマクロを再帰的に適用するのは簡単ではありません。ただし、複雑な回避策を採用すると、目的の機能を備えた MAP マクロを実現できます。
再帰を開始するには、次のプレースホルダーとして機能する MAP_OUT マクロを定義します。マクロ展開:
次に、デモのために 2 つのマクロ A と B を作成します。 recursion:
A(何とか) を評価すると、次の出力が得られます:
プリプロセッサは、B(何とか) をまだマクロ呼び出しではないため、プレーン テキストとして扱います。このテキストが再処理されると、展開されて次のものが生成されます。
出力をプリプロセッサに継続的にフィードバックすることで、再帰を無期限に維持できます。
この繰り返しの評価を自動化するには、EVAL マクロを使用します。
EVAL マクロは、マクロ呼び出しのツリーを通じてその引数を伝播し、評価カウントを 365 倍します。
無限の再帰を防ぐには、終了のメカニズムが必要です。 MAP_END という名前の特別なマクロを定義します:
評価されると、このマクロは何も行わず、実質的に再帰を停止します。
再帰マクロと終了マクロのどちらかを選択するために、MAP_NEXT:
MAP_NEXT は、現在の項目をリストの終わりのマーカー () と比較します。一致する場合は MAP_END を返し、そうでない場合は次のパラメータを返します。実際的な実装これらの要素を組み合わせると、A マクロと B マクロの実用的なバージョンを作成できます。MAP0 と MAP1 は、操作 f を現在の項目 x に適用します。次に、次の項目であるピークをチェックして、再帰を続行するか終了するかを決定します。最後に、最上位の MAP マクロですべてを結び付けます。MAP 場所引数リストにリストの終わりのマーカーを追加し、EVAL を介してそれを渡します。これらの手法を利用すると、C で再帰マクロ機能を実現でき、複雑な処理が可能になります。マクロベースの処理以上がマクロ展開の制限にもかかわらず、C で再帰マクロ機能を実現するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。