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 :
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!