Search code examples
c++cvariadic-functions

How can I wrap a function with variable length arguments?


I am looking to do this in C/C++. I came across Variable Length Arguments, but this suggests a solution with Python and C using libffi.

Now, if I want to wrap the printf function with myprintf.

I do it like below:

void myprintf(char* fmt, ...)
{
    va_list args;
    va_start(args, fmt);
    printf(fmt, args);
    va_end(args);
}

int _tmain(int argc, _TCHAR* argv[])
{
    int a = 9;
    int b = 10;
    char v = 'C';
    myprintf("This is a number: %d and \nthis is a character: %c and \n another number: %d\n", a, v, b);
    return 0;
}

But the results are not as expected!

This is a number: 1244780 and
this is a character: h and
another number: 29953463

What did I miss?


Solution

  • The problem is that you cannot use 'printf' with va_args. You must use vprintf if you are using variable argument lists. vprint, vsprintf, vfprintf, etc. (there are also 'safe' versions in Microsoft's C runtime that will prevent buffer overruns, etc.)

    You sample works as follows:

    void myprintf(char* fmt, ...)
    {
        va_list args;
        va_start(args, fmt);
        vprintf(fmt, args);
        va_end(args);
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        int a = 9;
        int b = 10;
        char v = 'C';
        myprintf("This is a number: %d and \nthis is a character: %c and \n another number: %d\n", a, v, b);
        return 0;
    }