The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"va_list, va_start и вызов из foo1(p, ...)  foo2(p, ...)"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (C/C++)
Изначальное сообщение [ Отслеживать ]

"va_list, va_start и вызов из foo1(p, ...)  foo2(p, ...)"  +/
Сообщение от adolfus email(ok) on 16-Ноя-11, 22:30 
Есть функция mkmsg(), принимающая переменное число параметров. Что-то вроде такой:

char *mkmsg(char *fmt, ...) {

   char str[NAME_MAX+1];
   va_list ap;
   ...
   va_start(ap, fmt);
   vsnprintf(str, NAME_MAX, fmt, ap);
   va_end(ap);
   ...
   return strdup(str);
}

Всем хороша, только вот каждый раз перед ее вызовом приходится дергать free() для предыдущего вызова, типа так:
char *msg;
...
strlen(msg = mkmsg("msg1"));
free(msg);
strlen(msg = mkmsg("msg2"));

решил написать обертку, типа такой:

char *mkmsg2(char *msg, char *fmt, ...) {

   char *str;
   va_list ap;
   ...
   if (msg)
      free(msg);

   str = <а тут хочу вызвать оригинальную mkmsg() и передать ей остальные параметры>

   return str;
}

Подскажите, плз., как тут выкрутиться не переписывая mkmsg()

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "va_list, va_start и вызов из foo1(p, ...)  foo2(p, ...)"  +/
Сообщение от shadowmaan (ok) on 17-Ноя-11, 10:37 
>[оверквотинг удален]
>    char *str;
>    va_list ap;
>    ...
>    if (msg)
>       free(msg);
>    str = <а тут хочу вызвать оригинальную mkmsg() и
> передать ей остальные параметры>
>    return str;
> }
> Подскажите, плз., как тут выкрутиться не переписывая mkmsg()

Как вариант, вместо функции mkmsg2 можно использовать макрос

#define mkmsg2(msg, fmt, ...) ( ... проверка/очистка msg ... mkmsg(fmt, __VA_ARGS__) ... )

http://en.wikipedia.org/wiki/Variadic_macro

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру