va_arg返回错误的参数

Jon*_*Yee 2 c c++ variadic-functions

使用以下代码,va_arg将通过vProcessType返回第二次和第三次传递的垃圾.

// va_list_test.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <tchar.h>
#include <cstdarg>
#include <windows.h>

void processList(LPTSTR str, ...);
void vProcessList(LPTSTR str, va_list args);
void vProcessType(va_list args, int type);

int _tmain(int argc, _TCHAR* argv[])
{
    LPTSTR a = TEXT("foobar");
    int b = 1234;
    LPTSTR c = TEXT("hello world");
    processList(TEXT("foobar"), a, b, c);
    return 0;
}

void processList(LPTSTR str, ...)
{
    va_list args;
    va_start(args, str);
    vProcessList(str, args);
    va_end(args);
}
void vProcessList(LPTSTR str, va_list args)
{
    vProcessType(args, 1);
    vProcessType(args, 2);
    vProcessType(args, 1);
}

void vProcessType(va_list args, int type)
{
    switch(type)
    {
    case 1:
        {
            LPTSTR str = va_arg(args, LPTSTR);
            printf("%s", str);
        }
        break;
    case 2:
        {
            int num = va_arg(args, int);
            printf("%d", num);
        }
        break;
    default:
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

是不是以这种方式传递了一个va_list的东西?在vProcessType中第一次调用va_arg会返回预期的字符串.第二次和第三次通过此函数返回指向第一个字符串开头的指针,而不是预期的值.

如果我将va_arg调用提升到vProcessList,一切似乎都能正常工作.只有当我通过函数传递va_list时才会出现这种行为.

Mic*_*urr 5

va_list每次都要传递相同的内容vProcessType()- 在每次调用中vProcessType()你都会va_arg在列表中的第一个上进行操作.

所以你总是TEXT("foobar")在调用时处理参数vProcessType().

另请注意,标准有关于将a传递va_list给另一个函数的说法:

ap[类型va_list] 对象可以作为参数传递给另一个函数; 如果该函数va_arg使用参数调用宏,则调用函数中ap的值ap是不确定的,并且应该在va_end进一步引用之前传递给宏ap.

标准中的脚注指示将指针传递给a是完美的va_list,所以你可能想要做的是vProcessType()指针指向va_list:

void vProcessType(va_list* pargs, int type);
Run Code Online (Sandbox Code Playgroud)