J'ai rencontré un petit problème théorique. Dans un morceau de code que je maintiens, il y a un ensemble de macros comme
#define MAX_OF_2(a, b) (a) > (b) ? (a) : (b)
#define MAX_OF_3(a, b, c) MAX_OF_2(MAX_OF_2(a, b), c)
#define MAX_OF_4(a, b, c, d) MAX_OF_2(MAX_OF_3(a, b, c), d)
...etc up to MAX_OF_8
Ce que j'aimerais faire, c'est les remplacer par quelque chose comme ça :
/* Base case #1, single input */
#define MAX_OF_N(x) (x)
/* Base case #2, two inputs */
#define MAX_OF_N(x, y) (x) > (y) ? (x) : (y)
/* Recursive definition, arbitrary number of inputs */
#define MAX_OF_N(x, ...) MAX_OF_N(x, MAX_OF_N(__VA_ARGS__))
...qui, bien sûr, n'est pas un code de préprocesseur valide.
Ignorant que ce cas particulier devrait probablement être résolu en utilisant une fonction plutôt qu'une macro de préprocesseur est-il possible de définir une macro variadique MAX_OF_N() ?
Par souci de clarté, le résultat final devrait être une seule macro qui prend un nombre arbitraire de paramètres et évalue le plus grand d'entre eux. J'ai le sentiment étrange que cela devrait être possible, mais je ne vois pas comment.
11 votes
+1 pour le tag "preprocessor-abuse" :)
1 votes
stackoverflow.com/questions/6707148 démontre la récursion mutuelle (la réponse la plus votée mais non acceptée)