Maison >développement back-end >C++ >Pouvons-nous créer des macros récursives dans le prétraitement C/C ?

Pouvons-nous créer des macros récursives dans le prétraitement C/C ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-09 11:47:16247parcourir

Can We Create Recursive Macros in C/C   Preprocessing?

Pouvons-nous avoir des macros récursives ?

Bien que les macros ne se développent pas directement de manière récursive, il existe des techniques intelligentes pour obtenir des fonctionnalités similaires.

Solution de contournement pour Macros récursives

Nous pouvons utiliser des expressions différées et l'indirection pour empêcher le préprocesseur de désactiver la macro lors de l'expansion. Voici un exemple de création d'une macro pr récursive :

#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))

Cette macro se développe comme suit :

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

Exemple de macro de répétition récursive

En utilisant ces techniques, nous pouvons créer une macro REPEAT récursive :

#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

Applicabilité et Limitations

Bien que ces solutions de contournement autorisent les macros récursives, il est important de noter qu'elles peuvent être complexes et ne pas fonctionner dans tous les cas. Il est recommandé d'aborder l'utilisation récursive des macros avec prudence et d'envisager des alternatives telles que des fonctions ou une métaprogrammation de modèles, le cas échéant.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn