С и переменное число аргументов

1,00
р.
Здравствуйте.
Такой вопрос появился. Есть ли в C удобный способ последовательно затолкать элементы массива в функции с переменным количеством аргументов.
Поясню на примере:
void print_arr(char *fmt, char **arr, int arrsz) { printf(fmt, ???) }
Или обязательно писать обвёртку, которая будет с массивами работать?
Можно ли как-то стандартыми средствами преобразовать arr в тип va_list и передать vprintf?
Заранее спасибо за ваши ответы.


Ответ
Возможно появились компиляторы C, в которых va_list реализовано по-другому, но c давних пор это работало:
char *args[] = {"one", "two", "three"} vprintf("%s, %s, %s
", args)
gcc выдаёт предупреждение, которое легко снимается преобразованием:
vprintf("%s, %s, %s
", (va_list)args)
результат тот который нужен:
$ gcc valist.c $ ./a.out one, two, three
Для gcc под amd64 найдено экспериментально следующее извращение:
char *args[] = {"one", "two", "three"} struct { int x char **y, **z } valist = {48, &args, &args} vprintf("%s, %s, %s
", (void*)&valist)
Если sizeof(va_list) == 4 то первый способ скорее всего работает, во втором случае sizeof(va_list) == 24