使用以下代码,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;
    }
}

以这种方式传递va_list不允许吗? vProcessType中对va_arg的第一次调用将返回预期的字符串。第二次和第三次通过此函数返回一个指针,该指针指向第一个字符串的开头,而不是预期的值。

如果我将va_arg调用提升到vProcessList,那么一切似乎都可以正常工作。似乎只有当我通过一个函数传递va_list时,我才能得到这种行为。

最佳答案

您每次都将相同的va_list传递给vProcessType()-在对列表中第一个vProcessType()进行操作的va_arg的每次调用中。

因此,在调用TEXT("foobar")时,您总是要处理vProcessType()参数。

另请注意,该标准对将va_list传递给另一个函数有这样的说法:



标准中的脚注表示将指针传递给va_list是完全可以的,因此您可能想要做的是让vProcessType()接受指向va_list的指针:

void vProcessType(va_list* pargs, int type);

关于c++ - va_arg返回错误的参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3168056/

10-11 15:51