Maison > développement back-end > C++ > Les macros récursives peuvent-elles être réalisées en C/C ?

Les macros récursives peuvent-elles être réalisées en C/C ?

Linda Hamilton
Libérer: 2024-12-16 13:55:16
original
929 Les gens l'ont consulté

Can Recursive Macros Be Achieved in 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))
Copier après la connexion

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

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

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

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!

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