call printf using va_list
Instead of printf
, I recommend you try vprintf
instead, which was created for this specific purpose:
#include <stdio.h>#include <stdlib.h>#include <stdarg.h>void errmsg( const char* format, ... ){ va_list arglist; printf( "Error: " ); va_start( arglist, format ); vprintf( format, arglist ); va_end( arglist );}int main( void ){ errmsg( "%s %d %s", "Failed", 100, "times" ); return EXIT_SUCCESS;}
As others have pointed out already: In this case you should use vprintf
instead.
But if you really want to wrap printf
, or want to wrap a function that does not have a v...
version, you can do that in GCC using the non-standard __builtin_apply
feature:
int myfunction(char *fmt, ...){ void *arg = __builtin_apply_args(); void *ret = __builtin_apply((void*)printf, arg, 100); __builtin_return(ret);}
The last argument to __builtin_apply
is the max. total size of the arguments in bytes. Make sure that you use a value here that is large enough.