Create va_list dynamically

后端 未结 7 748
一个人的身影
一个人的身影 2020-12-06 01:08

I have a function

void foo(int cnt, va_list ap);

I need to use it, but requirement is quite strict, number of va_list vary an

7条回答
  •  青春惊慌失措
    2020-12-06 01:21

    What you're wanting to do is to simulate the call stack so you can pass a constructed va_list to foo(). This is rather specific to the compiler ( and warning, there are differences between even 32- and 64-bit compilers ). The following code is for ENTERTAINMENT PURPOSES ONLY!!! as (if it even works on your system) it is prone to breakage. With it, I use a flat memory buffer and the populate it with a count and a bunch of character strings. You could fill it as appropriate with pointers to your strings and hand them down.

    It does seem to work on my system, Windows 7 w/ Visual Studio 2008, for 32-bit applications only.

    * BAD IDEA CODE FOLLOWS!!! *

    #define PSEUDOSTACKSIZE ( sizeof(int) + 999 * sizeof(const char*) )
    #pragma pack( push,1 )
    union PSEUDOSTACK
    {
        int count;
        char data[PSEUDOSTACKSIZE];
    };
    #pragma pack( pop )
    
    void foo( int count, va_list args )
    {
        for ( int i = 0; i < count; i++ )
        {
            char *s = va_arg( args, char* );
            printf( "%s\n", s);
        }
    }
    
    void bar( PSEUDOSTACK data, ... ) 
    { 
        va_list args; 
        va_start(args, data.count); 
        foo( data.count, args);
        va_end(args); 
    } 
    // And later on, the actual test case code.
    PSEUDOSTACK barData;
    barData.count = 999;
    char *p = barData.data + sizeof(int);
    for ( int i = 0; i < 999; i++, p += sizeof(char*) )
    {
        *reinterpret_cast(p) = "ThisIsABadIdea";
    }
    bar( barData );
    

    I'll now go hang my head in shame for thinking of such an idea.

提交回复
热议问题