call printf using va_list

65,062

Solution 1

Use vprintf() instead.

Solution 2

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

Solution 3

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.

Solution 4

This is not how you use printf(). If you want to use va_lists, use vprintf() instead. Look here for reference.

Share:
65,062
Alex F
Author by

Alex F

Updated on July 08, 2022

Comments

  • Alex F
    Alex F almost 2 years
    void TestPrint(char* format, ...)
    {
        va_list argList;
    
        va_start(argList, format);
        printf(format, argList);
        va_end(argList);
    }
    
    
    int main()
    {
        TestPrint("Test print %s %d\n", "string", 55);
        return 0;
    }
    

    I need to get:

    Test print string 55
    

    Actually, I get garbage output. What is wrong in this code?