Спецификация препроцессора об этом несколько многословна, но достаточно сказать, что вы указали vX
, должно принимать как минимум два аргумента.
Причина в том, что количество аргументов в значительной степени определяется количеством запятых в макросе.Так, например, vX(f,)
может привести к исчезновению вашей ошибки.Причина заключается в том, что мы снова предоставляем два аргумента, а именно f
и пустую последовательность токенов после запятой.
Один из способов обойти это - разделить макрос на два расширения:
#define vX_(a, ...) ((a)(__VA_ARGS__) ? 1 : 0)
#define vX(...) vX_(__VA_ARGS__,)
Обратите внимание, как я добавил эту запятую?Теперь, когда вы напишите vX(f)
, он расширится до vX_(f,)
, который снова расширится, чтобы дать вам желаемое выражение.Хотя, в общем случае это не сработает, так как вы получите запятую в конце.Вот почему GCC ввел __VA_OPT__
( @ unwind's answer ), чтобы запятую можно было добавить условно.