Здравствуйте. Такой вопрос появился. Есть ли в 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