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
Linda Hamiltonoriginal
2024-12-16 13:55:16930parcourir

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

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!

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