Maison > développement back-end > C++ > Pouvons-nous créer des macros récursives dans le prétraitement C/C ?

Pouvons-nous créer des macros récursives dans le prétraitement C/C ?

Barbara Streisand
Libérer: 2024-12-09 11:47:16
original
211 Les gens l'ont consulté

Can We Create Recursive Macros in C/C   Preprocessing?

Pouvons-nous avoir des macros récursives ?

Bien que les macros ne se développent pas directement de manière récursive, il existe des techniques intelligentes pour obtenir des fonctionnalités similaires.

Solution de contournement pour Macros récursives

Nous pouvons utiliser des expressions différées et l'indirection pour empêcher le préprocesseur de désactiver la macro lors de l'expansion. Voici un exemple de création d'une macro pr récursive :

1

2

3

4

5

6

7

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

Copier après la connexion

Cette macro se développe comme suit :

1

2

pr(5) -> ((5==1)? 1 : pr_id()(4))

EXPAND(pr(5)) -> ((5==1)? 1 : ((4==1)? 1 : pr_id()(3)))

Copier après la connexion

Exemple de macro de répétition récursive

En utilisant ces techniques, nous pouvons créer une macro REPEAT récursive :

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

#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

EVAL(REPEAT(8, M, ~)) // 0 1 2 3 4 5 6 7

Copier après la connexion

Applicabilité et Limitations

Bien que ces solutions de contournement autorisent les macros récursives, il est important de noter qu'elles peuvent être complexes et ne pas fonctionner dans tous les cas. Il est recommandé d'aborder l'utilisation récursive des macros avec prudence et d'envisager des alternatives telles que des fonctions ou une métaprogrammation de modèles, le cas échéant.

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