Maison > développement back-end > C++ > Comment la récursivité peut-elle être émulée avec des macros C/C ?

Comment la récursivité peut-elle être émulée avec des macros C/C ?

Linda Hamilton
Libérer: 2024-12-07 08:53:11
original
998 Les gens l'ont consulté

How Can Recursion Be Emulated with C/C   Macros?

Macros récursives en C/C

Les macros en C/C ne prennent pas en charge la récursivité directe. Cependant, il est possible d'émuler la récursivité grâce à une combinaison de techniques de prétraitement et d'indirection.

Exemple de macro de type récursive

La macro suivante simule la récursion à l'aide d'expressions différées et indirection :

#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))
Copier après la connexion

Exécution Processus

Lorsque pr(5) est rencontré, les étapes suivantes se produisent :

  1. pr(5) se développe en ((5 == 1) ? 1 : DEFER( pr_id)()(5 - 1)).
  2. Le préprocesseur peint pr(5) en bleu (contexte désactivé), l'empêchant de se développer plus loin.
  3. DEFER(pr_id)()(5 - 1) devient OBSTRUCT(pr_id)()(5 - 1) et pr_id () est peint en bleu.
  4. EXPAND(pr(5 )) se développe en ((5 == 1) ? 1 : ((5 - 1 == 1) ? 1 : DEFER(pr_id)()(5 - 1 - 1)))
  5. Des extensions supplémentaires sont nécessaires pour compléter la récursion.

Macro de répétition récursive

Un exemple plus complexe de macro récursive -like macro est une macro de répétition qui exécute un bloc de code spécifique un nombre de fois donné :

#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
Copier après la connexion

Ceci La macro peut être utilisée comme suit :

EVAL(REPEAT(8, M, ~)) // 0 1 2 3 4 5 6 7
Copier après la connexion

Limitations

Bien que l'émulation de la récursivité via des macros soit possible, elle est généralement considérée comme une mauvaise pratique en raison des implications potentielles sur les performances et problèmes de lisibilité du code. Le C moderne propose des mécanismes alternatifs de récursivité, tels que les expressions lambda et la métaprogrammation de modèles.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal