LINUX.ORG.RU

При вызове «vfprintf(stderr, format, ap)» дважды на экран выводится мусор. Можно ли обойтись без va_copy?

 


0

2

Вот такой код печатает мусор при втором вызове vprintf.

va_list ap;
va_start (ap, format);
vfprintf(stderr, format, ap);
vfprintf(stderr, format, ap);
va_end (ap); 

Сделан workaround в виде:

va_list ap;
va_list ap_console;
va_start (ap, format);
va_copy(ap_console, ap);
vfprintf(stderr, format, ap);
vfprintf(stderr, format, ap_console);
va_end (ap); 
va_end (ap_console); 
Неужели это правильное решение? И нельзя ли избавиться от va_copy?

Неужто почитать маны сложнее и дольше чем на форуме спрашивать?

man vfprintf

The functions vprintf(), vfprintf(), vdprintf(), vsprintf(), vsnprintf() are equivalent to the functions printf(), fprintf(), dprintf(), sprintf(), snprintf(), respectively, except that they are called with a va_list instead of a variable number of arguments. These functions do not call the va_end macro. Because they invoke the va_arg macro, the value of ap is undefined after the call. See stdarg(3).

man va_arg

The va_arg() macro expands to an expression that has the type and value of the next argu‐ ment in the call. The argument ap is the va_list ap initialized by va_start(). Each call to va_arg() modifies ap so that the next call returns the next argument.

Stanson ★★★★★
()
Последнее исправление: Stanson (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.