Вы не можете использовать va_list
для доступа к локальным переменным. Макросы va_start
, va_copy
и va_end
предназначены только для обработки аргументов функции variadi c. Макрос не является функцией.
Для макросов C variadi c идентификатор __VA_ARGS__
в тексте замены макроса будет расширен до аргументов c variadi, поэтому возможная реализация вашего * Макрос 1008 * выглядит следующим образом:
#define NULLCHECK_VR(num, ...) \
do { \
void *_ptrs[] = { __VA_ARGS__ }; \
int _num = (num); \
int v_index; \
\
for (v_index = 0; v_index < _num; v_index++) \
{ \
if (NULL == _ptrs[v_index]) \
{ \
printf("NULL \n"); \
} \
else \
{ \
printf("NOT NULL \n"); \
} \
} \
} while (0)
Здесь __VA_ARGS__
используется для инициализации локального _ptrs
массива.
(я добавил локальную переменную _num
, чтобы избежать расширения параметр num
несколько раз, и я использовал идиому do
while (0)
, чтобы превратить блок в оператор.)