ホームページ > バックエンド開発 > C++ > 再帰マクロは C/C で実現できますか?

再帰マクロは C/C で実現できますか?

Linda Hamilton
リリース: 2024-12-16 13:55:16
オリジナル
929 人が閲覧しました

Can Recursive Macros Be Achieved in C/C  ?

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

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