Не делайте этого с помощью вариационной функции, эта концепция должна быть удалена. В частности, это не имеет никакого смысла для чего-то, что должно принимать аргументы одного и того же типа, void*
.
Просто простую функцию, первый, который принимает массив указателей
void free_arrays(void* a[]) {
for (size_t i = 0; a[i]; ++i) free(a[i]);
}
Затем вы можете обернуть, что с помощью макроса, как тот
#define FREE_ARRAYS(...) free_arrays((void*[]){ __VA_ARGS__, 0 })
Это предполагает, что ни один из ваших указателей нет уже 0
, так как обработка остановится в этой точке.
Если у вас есть необходимость в работе, даже если некоторые из указателей равны 0
, вам необходимо передать количество элементов в качестве первого параметра вашей функции. Это немного утомительно, но может быть определено и в макросе.
void free_arrays0(size_t n, void* a[]) {
for (size_t i = 0; i < n; ++i) free(a[i]);
}
#define FREE_ARRAYS0(...) \
free_arrays( \
sizeof((void*[]){ __VA_ARGS__})/sizeof(void*), \
(void*[]){ __VA_ARGS__} \
)
Нравится? http://stackoverflow.com/a/20993120/2327831 – this
Это невозможно сделать без #define? – Vincent
Конечно, вам просто нужно каждый раз вводить первый и последний аргументы. В этом случае я предпочел бы сделать массив и передать его, а не использовать variadic f. – this