ホームページ > バックエンド開発 > C++ > C で別のマクロに渡された引数で動作するマクロを定義するにはどうすればよいですか?

C で別のマクロに渡された引数で動作するマクロを定義するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-11-15 15:02:03
オリジナル
675 人が閲覧しました

How to Define a Macro That Operates on Arguments Passed to Another Macro in C?

マクロ引数内のマクロ

問題

別のマクロに渡された引数を操作するマクロを定義するにはどうすればよいでしょうか?具体的には、次の点を考慮してください:

望ましい使用法:

再帰の実現

型破りな回避策を使用すると、C で再帰マクロが可能になります。目標は、次のような MAP マクロを作成することです:

基本再帰

評価されないマクロ呼び出しに似たものを出力する方法を作成することから始めます:

次のマクロを検討します:

評価中A(何とか) はテキストを生成します:

B (何とか) 呼び出しはこの段階では単なるテキストであるため、プリプロセッサはここで再帰を検出しません。このテキストをプリプロセッサにフィードバックすると、それが展開されます。

この出力を再度評価すると、A (まあまあ) マクロが展開され、再帰が完了します。このプロセスは、出力が再びプリプロセッサにフィードバックされるまで続きます。

複数の評価を容易にするために、EVAL マクロを使用してマクロ呼び出しのチェーンに引数を渡します。

Eachレベルは前任者の努力を増幅し、最終的に入力を 365 回評価します。たとえば、EVAL(A(何とか)) は、何とかの 365 コピーを生成し、その後に未評価の B (何とか) が続きます。このセットアップは、特定のスタック深さ制限内での再帰の基礎を提供します。

終了検出

次のハードルは、再帰をいつ終了するかを決定することです。

MAP_END マクロを次のように定義します。リストの終わりのマーカー:

このマクロを評価しても何も行わず、

2 つのマクロのどちらかを選択するには、リスト項目を特別なリスト終了マーカー () と比較する MAP_NEXT を使用します。

MAP_NEXT は、リスト項目と次の項目に基づいて続行または停止します。一致する場合は MAP_END を返し、そうでない場合は次のパラメータを返します。

すべてをまとめる

これらのコンポーネントを使用して、A と B の使用可能なバージョンを構築できます。

これらのマクロは、操作 f を現在のリスト項目 x に適用し、次のリスト項目であるピークを調べて、続行するかどうかを決定します。

最後に、トップレベルの MAP マクロですべてを組み立てます。

このマクロは、リストの最後に () マーカーを追加し、全体を EVAL に渡します。

コードは、便宜上、GitHub のライブラリとして利用できます。

以上がC で別のマクロに渡された引数で動作するマクロを定義するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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