URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9289
[ Назад ]

Исходное сообщение
"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 , 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