I\'m trying to write a function that accepts a variable number of parameters like printf, does some stuff, then passes the variable list to printf. I\'m not sure how to do t
Don't pass the results to printf
. pass them to vprintf
. vprintf
specifically exists to handle passing in va_list
arguments. From the Linux man page:
#include <stdio.h>
int printf(const char *format, ...);
int fprintf(FILE *stream, const char *format, ...);
int sprintf(char *str, const char *format, ...);
int snprintf(char *str, size_t size, const char *format, ...);
#include <stdarg.h>
int vprintf(const char *format, va_list ap);
int vfprintf(FILE *stream, const char *format, va_list ap);
int vsprintf(char *str, const char *format, va_list ap);
int vsnprintf(char *str, size_t size, const char *format, va_list ap);
Notice how the latter explicitly take va_list
arguments such as the ones you declare inside a function taking ...
in the parameter list. So your function would be declared like this:
void forward_args( const char *format , ... ){
va_list arglist;
va_start( arglist, format );
vprintf( format, arglist );
va_end( arglist );
}
I'm not (off the top of my head) familiar with how to implement this. I would suggest looking at an implementation of functions like printf. Several open source implementations exist. glibc, uclibc (not sure what bsd and opensolaris call/use for their libc).
I'm pretty sure you're looking for va_start()
/ vprintf()
/ vsnprintf()
/ va_end()
, there's no need to implement these yourself.
You'll be passing along the arglist value to a function designed to consume it. See the stdarg and vprintf documentation for more clues.