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