Страницы

Поиск по вопросам

пятница, 12 октября 2018 г.

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

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

Комментариев нет:

Отправить комментарий