ホームページ >バックエンド開発 >C++ >C/C 前処理で再帰マクロを作成できますか?

C/C 前処理で再帰マクロを作成できますか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-09 11:47:16169ブラウズ

Can We Create Recursive Macros in C/C   Preprocessing?

再帰マクロは使用できますか?

マクロは直接再帰的に展開しませんが、同様の機能を実現する賢いテクニックがあります。

回避策再帰マクロ

遅延式と間接指定を使用して、プリプロセッサの動作を防ぐことができます。展開中にマクロが無効になるのを防ぎます。再帰的 pr マクロの作成例を次に示します。

#define EMPTY(...)
#define DEFER(...) __VA_ARGS__ EMPTY()
#define OBSTRUCT(...) __VA_ARGS__ DEFER(EMPTY)()
#define EXPAND(...) __VA_ARGS__

#define pr_id() pr
#define pr(n) ((n==1)? 1 : DEFER(pr_id)()(n-1))

このマクロは次のように展開されます。

pr(5) -> ((5==1)? 1 : pr_id()(4))
EXPAND(pr(5)) -> ((5==1)? 1 : ((4==1)? 1 : pr_id()(3)))

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

これらの手法を使用すると、再帰的な REPEAT を作成できますマクロ:

#define REPEAT(count, macro, ...) \
    WHEN(count) \
    ( \
        OBSTRUCT(REPEAT_INDIRECT) () \
        ( \
            DEC(count), macro, __VA_ARGS__ \
        ) \
        OBSTRUCT(macro) \
        ( \
            DEC(count), __VA_ARGS__ \
        ) \
    )
#define REPEAT_INDIRECT() REPEAT

#define M(i, _) i
EVAL(REPEAT(8, M, ~)) // 0 1 2 3 4 5 6 7

適用性と制限

これらの回避策により再帰マクロが有効になりますが、マクロが複雑になる可能性があり、すべての場合に機能するとは限らないことに注意することが重要です。再帰的なマクロの使用には慎重に取り組み、必要に応じて関数やテンプレートのメタプログラミングなどの代替手段を検討することをお勧めします。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。