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
Linda Hamiltonoriginal
2024-12-07 08:53:111094parcourir

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

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

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

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

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!

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