call printf using va_list call printf using va_list c c

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;}

Source


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.