Dans le domaine fascinant de la programmation, les macros offrent un outil puissant pour améliorer l'efficacité et l'extensibilité du code. Les macros fonctionnent au niveau textuel, permettant aux développeurs de manipuler et de redéfinir des fragments de code avant la compilation.
Parmi le répertoire des capacités des macros, la possibilité d'itérer sur les arguments des macros reste un mystère intrigant. Imaginez un scénario dans lequel vous souhaitez créer une macro qui exécute une opération spécifique sur chacun de ses arguments. Cette tâche pose un défi unique que nous allons approfondir et surmonter dans cet article.
Notre quête initiale est de concevoir une macro appelée PRINT_ALL qui appliquera le PRINT macro à chacun de ses arguments. Ainsi, par exemple :
#define PRINT(a) printf(#a": %d", a) #define PRINT_ALL(...) ???
int a = 1, b = 3, d = 0; PRINT_ALL(a,b,d);
Devrait idéalement produire :
a: 1 b: 3 d: 0
L'approche simple impliquerait une macro récursive, mais hélas, les macros ne sont pas intrinsèquement récursives en C. Cela présente un obstacle formidable qui nécessite une solution de contournement innovante.
Exploiter la récursivité dans les macros nécessite un équilibre délicat entre ingéniosité et exécution minutieuse. La clé est d'utiliser une série de macros qui simulent un comportement récursif sans invoquer le mot-clé récursif lui-même.
1. L'espace réservé MAP_OUT :
Nous commençons par une macro d'espace réservé appelée MAP_OUT qui sert de sentinelle, un tampon de texte qui stockera les invocations de macro sous forme de texte brut plutôt que de code. Cela nous permet de contrôler le flux de récursion.
2. La macro EVAL :
Ensuite, nous introduisons la macro EVAL, qui agit comme le moteur de notre récursivité. Il évalue progressivement le texte saisi, en multipliant les itérations à chaque niveau pour garantir un traitement approfondi.
3. Détection du point final :
Pour arrêter la récursion au point final souhaité, nous introduisons une autre macro d'espace réservé appelée MAP_END. L'évaluation de cette macro ne fait rien, mettant effectivement fin à la récursion.
4. La macro MAP_NEXT :
Enfin, nous avons besoin d'un moyen de faire la distinction entre l'élément de liste actuel et le marqueur spécial de fin de liste. La macro MAP_NEXT accomplit cela en renvoyant MAP_END si l'élément actuel correspond au marqueur ou à l'argument suivant si ce n'est pas le cas.
Avec ces composants individuels en place, nous pouvons assemblons maintenant une solution complète :
1. Les macros MAP0 et MAP1 :
Ces macros gèrent le cycle récursif, appliquant l'opération à l'élément actuel puis examinant l'élément suivant à l'aide de la macro MAP_NEXT.
2 . La macro CARTE DE HAUT NIVEAU :
Pour lancer la récursion, nous enveloppons tout dans la macro MAP de niveau supérieur, qui ajoute le marqueur de fin et transmet le texte modifié via EVAL.
Bien que ce ne soit pas tout à fait simple , cette approche détournée nous donne accès à des macros récursives. Adoptez l'élégance de cette technique et exploitez les possibilités illimitées qu'elle ouvre dans vos efforts de programmation.
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!