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时才会出现这种行为.
你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)
| 归档时间: |
|
| 查看次数: |
2329 次 |
| 最近记录: |