LINUX.ORG.RU

Как объявить и работать с функцией у которой переменное число параметров?


0

0

Примерно как функция printf("%s %s", d, a, ...); Объявляться должна так как я понял: int func(char *a, ...);

но как к этим переданным пораметрам получить доступ. Нифига не понял. И как работать с регистрами тоже

★★★

Посмотри на файл stdarg.h, там объявлены макросы va_list,va_start,va_arg,... которые тебе нужны и читай документацию. Работа с регистрами - что ты имеешь ввиду ?

EugenFF
()

void wait_box(const char *format, ...) {
char *msg;
GtkWidget *box;
va_list args;

if (!format)
return NULL;

va_start(args, format);
msg = g_strdup_vprintf(format, args);
va_end(args);
box = init_box_gui(msg, MB_ICON_WAIT, GTK_WINDOW_POPUP);
g_free(msg);

while (gtk_events_pending())
gtk_main_iteration();

gtk_widget_destroy(box);
}


Вот так можно :))

Banshee
()

Можно еще для этой функции сказать

void __attribute__((__format__(printf, 2, 3))) wait_box(const char *format, ...) {
...
}

Тогда компилятор будет проверять переданные параметры на соответствие форматной строчке на подобие функции printf.

:))

Banshee
()

Здорово ! Спасибо огромное ! А я всего то хотел сделать враппер на printf чтобы он возвращал не int, а результат своей работы.

Korwin ★★★
() автор топика

Да нема за что.

g_strdup_vprintf - это функция из gliba-а. Ее аналог как ты наверное догадался vprintf

Banshee
()

glib? Пожалуй для CGI не пойдет :-) Материал для проработки есть буду делать. Вот только может оно уже есть?

Korwin ★★★
() автор топика

Еще кое что.

__attribute__((__format__(printf, 1, 2))) нужно использовать в том примере, что я показал. Это значит, проверять форматную строчку, которая есть первый аргумент функции на соответствие остальным аргументам начиная со 2 аргумента способом напоминающим printf. Если интересно почитай manual по gcc. Там все есть?

Banshee
()

Если интерессует результат printf, и неохота заморачиваться над memory_streams, то можно заюзать asprintf(&s, fmt, ...) - в s вы получите результат. Эти функции, как и memory_streams появились в glibc.

vodz ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.