Итак, в основном я пытаюсь реализовать макрос для подсчета количества аргументов в VA_ARGS.
Для простоты он работает только до 3 параметров. Проблема в том, что когда макрос используется с менее чем 3 параметрами, он не работает и вызывает ошибку «ожидаемое выражение».
#define EXPAND( x ) x
#define PP_NARG(...) EXPAND(PP_ARG_N(__VA_ARGS__, PP_RSEQ_N()))
#define PP_ARG_N(_1, _2, _3, N,...) N
#define PP_RSEQ_N() 3,2,1,0
void main()
{
printf("\nTEST PP_NARG: %i", PP_NARG()); //Doesn't work (in this case it shouldn't work, so it's correct)
printf("\nTEST PP_NARG: %i", PP_NARG(0)); //Doesn't work
printf("\nTEST PP_NARG: %i", PP_NARG(0,0)); //Doesn't work
printf("\nTEST PP_NARG: %i", PP_NARG(0,0,0)); //Works
}
Сохраняя только рабочую строку, она правильно компилируется и печатает «TEST PP_NARG: 3».
Я считаю, что проблема может заключаться в том, что PP_RSEQ_N() по какой-то причине расширяется только до «3», а не «3,2,1,0», поскольку даже если PP_RSEQ_N() определен как этот
#define PP_RSEQ_N() 10,9,8,7,6,5,4,3,2,1,0
он по-прежнему не работает с менее чем 3 параметрами.
Я использую компилятор MSVC, и это может быть причиной проблемы, поскольку он не очень хорошо работает с макросами, как показано здесь: MSVC неправильно расширяет __VA_ARGS__