Maison >développement back-end >C++ >Pouvons-nous créer des macros récursives dans le prétraitement C/C ?
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.
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 :
#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))
Cette macro se développe comme suit :
pr(5) -> ((5==1)? 1 : pr_id()(4)) EXPAND(pr(5)) -> ((5==1)? 1 : ((4==1)? 1 : pr_id()(3)))
En utilisant ces techniques, nous pouvons créer une macro REPEAT récursive :
#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
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!