gpt4 book ai didi

c++ - va_arg 返回错误的参数

转载 作者:太空狗 更新时间:2023-10-29 23:31:38 26 4
gpt4 key购买 nike

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

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

另请注意,标准对将 va_list 传递给另一个函数有以下说明:

The object ap [of type va_list] may be passed as an argument to another function; if that function invokes the va_arg macro with parameter ap, the value of ap in the calling function is indeterminate and shall be passed to the va_end macro prior to any further reference to ap.

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

void vProcessType(va_list* pargs, int type);

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com