Maison >développement back-end >C++ >Les macros récursives peuvent-elles être réalisées en C/C ?
Macros récursives en C/C : mythe ou réalité ?
Malgré l'absence de macros récursives directes en C/C, des solutions de contournement astucieuses existent pour obtenir un semblant de fonctionnalité récursive.
Émulation de macro récursive utilisant Expressions différées et indirection
Une approche consiste à utiliser des expressions différées et une indirection. En utilisant les macros DEFER et EMPTY, nous pouvons différer l'évaluation de notre macro et empêcher qu'elle ne soit peinte en bleu par le préprocesseur. Cela contourne la limitation d'expansion récursive.
Par exemple, considérons la macro suivante :
#define pr_id() pr #define pr(n) ((n==1)? 1 : DEFER(pr_id)()(n-1))
En exploitant cette macro, nous obtenons la possibilité d'appeler de manière récursive pr(n) de manière détournée . Cependant, cette technique nécessite plusieurs analyses de préprocesseur pour une expansion complète.
Macro récursive via l'évaluation d'expression
Une autre méthode consiste à utiliser une série de macros d'évaluation d'expression, telles que EVAL1 pour EVAL5, pour simuler un comportement récursif.
Par exemple, pour définir une macro de répétition récursive, nous pouvons utiliser ce qui suit syntaxe :
#define REPEAT(count, macro, ...) \ WHEN(count) \ ( \ OBSTRUCT(REPEAT_INDIRECT) () \ ( \ DEC(count), macro, __VA_ARGS__ \ ) \ OBSTRUCT(macro) \ ( \ DEC(count), __VA_ARGS__ \ ) \ )
En appliquant plusieurs extensions, nous pouvons obtenir un comportement de type récursif, comme le démontre le code suivant :
EVAL(REPEAT(8, M, ~)) // Output: 0 1 2 3 4 5 6 7
Problème d'exécution de code
Le code mentionné dans votre question ne s'exécutera pas en raison d'une mauvaise utilisation de l'objet cout. La syntaxe correcte doit être :
cout << "result: " << pr(5) << endl;
Remplacez le < et > symboles avec << pour activer une sortie appropriée en C .
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!