Variadic рекурсивные макросы препроцессора - возможно ли это?
Я столкнулся с небольшой теоретической проблемой. В части кода, которую я поддерживаю, есть набор макросов, таких как
#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
Что я хотел бы сделать, это заменить их чем-то вроде этого:
/* 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__))
... что, конечно, не является допустимым кодом препроцессора.
Игнорирование того, что этот конкретный случай, вероятно, должен быть решен с использованием функции, а не макроса препроцессора, можно ли определить переменную макрос MAX_OF_N ()?
Просто для ясности, конечный результат должен быть одним макросом, который принимает произвольное количество параметров и оценивает самый большой из них. У меня странное ощущение, что это возможно, но я не понимаю, как это сделать.