マクロ展開の制限にもかかわらず、C で再帰マクロ機能を実現するにはどうすればよいでしょうか?

Barbara Streisand
リリース: 2024-11-16 02:17:03
オリジナル
234 人が閲覧しました

How can you achieve recursive macro functionality in C, despite the limitations of macro expansion?

引数マクロを使用した C での再帰マクロ

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート