Основы довольно просты:
#define COUNT(...) COUNT_(__VA_ARGS__, 7, 6, 5, 4, 3, 2, 1, 0)
#define COUNT_(A0, A1, A2, A3, A4, A5, A6, A7, ...) A7
#define F0()
#define F1(A0) A0
#define F2(A0, A1) A0 || A1
#define F3(A0, A1, A2) F2(A0, A1) || A2
#define F4(A0, A1, A2, A3) F3(A0, A1, A2) || A3
#define F(...) C(F, COUNT(__VA_ARGS__))(__VA_ARGS__)
#define C(X, Y) C_(X, Y)
#define C_(X, Y) X ## Y
, где C
- это обычный двухэтапный макрос конкатенации.Однако осталась одна проблема: пустой __VA_ARGS__
.
На самом деле, это не поддерживается самим стандартом C (вам придется переключиться на грядущий C ++ 20 для - или, возможно, C20 backports?).И задача довольно тяжелая (как, например, COUNT()
уступает 1, где первый аргумент в макросе COUNT_
является пустым!).Мне удалось решить эту проблему для аналогичной задачи довольно давно, так что вы можете взглянуть на там , должно быть достаточно просто импортировать соответствующую часть сюда ...