snprintf vsnprintf , SunOS 4 ( 20 ), - .
, , , va_list ap vsnprintf, , , reset on . gcc ( ).
:
n = vsnprintf(p, size, fmt, ap);
To:
va_list apc;
va_copy(apc, ap);
n = vsnprintf(p, size, fmt, apc);
va_end(apc);
, .
, , :
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
void
foo(const char *fmt, va_list ap)
{
#ifdef BAD
vprintf(fmt, ap);
#else
va_list apc;
va_copy(apc, ap);
vprintf(fmt, apc);
va_end(apc);
#endif
vprintf(fmt, ap);
}
void
bar(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
foo(fmt, ap);
va_end(ap);
}
int
main(int argc, char **argv)
{
bar("foo %s\n", "bar");
return 0;
}
:
$ cc -o foo foo.c && ./foo
foo bar
foo bar
$ cc -DBAD -o foo foo.c && ./foo
foo bar
foo