The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
va_list, va_start и вызов из foo1(p, ...)  foo2(p, ...), !*! adolfus, 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()

  • va_list, va_start и вызов из foo1(p, ...)  foo2(p, ...), !*! shadowmaan, 10:37 , 17-Ноя-11 (1)
    >[оверквотинг удален]
    >    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




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

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