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