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

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

Barbara Streisand
リリース: 2024-12-06 09:05:12
オリジナル
290 人が閲覧しました

Can Recursive Macros Be Implemented in C/C  ?

C/C での再帰マクロの探索 : 拡張の技術

再帰マクロは存在できますか?

マクロには不足があるのですがC/C には固有の再帰機能があり、再帰的なものを実現するための道が存在します。 行動。遅延式と間接演算を組み合わせて使用​​すると、再帰をシミュレートする複雑なマクロを作成できます。

仕組み

再帰マクロを作成するには、マルチマクロを採用する必要があります。 -ステッププロセス:

  1. 妨害自己拡張: 無効化コンテキストを作成することで、マクロが展開を停止しないようにします。
  2. 間接: 間接化を使用して、展開を後の段階に延期します。
  3. 拡張: 複数のスキャンを適用して拡張を完了しますprocess.

例: 再帰的繰り返しマクロ

再帰的繰り返しマクロの例を次に示します。

#define REPEAT(count, macro, ...) \
    WHEN(count) \
    ( \
        OBSTRUCT(REPEAT_INDIRECT) () \
        ( \
            DEC(count), macro, __VA_ARGS__ \
        ) \
        OBSTRUCT(macro) \
        ( \
            DEC(count), __VA_ARGS__ \
        ) \
    )
ログイン後にコピー

このマクロは次のようになります。のように呼び出されますこれ:

EVAL(REPEAT(8, M, ~)) // Outputs: 0 1 2 3 4 5 6 7
ログイン後にコピー

サンプル実行の問題

提供されたコード:

# define pr(n) ((n==1)? 1 : pr(n-1))
void main ()
{
    int a=5;
    cout<<"result: "<< pr(5) <<endl;
    getch();
}
ログイン後にコピー

は再帰マクロの問題により実行されません。 pr マクロは再帰のみに依存しているため、無限に拡張されます。

解決策

この問題を解決するには、次の非再帰バージョンのマクロを使用できます。

#define fact(n) ((n == 1)? 1 : n * fact(n - 1))
ログイン後にコピー

以上が再帰マクロは C/C で実装できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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