gpt4 book ai didi

c++ - 以类引用作为第一个参数的可变参数

转载 作者:太空宇宙 更新时间:2023-11-03 10:36:43 24 4
gpt4 key购买 nike

我有以下代码:

#include <cstdarg>
#include <iostream>

using namespace std;

class a {
};

void fun1(a& aa, ...)
{
va_list argp;
va_start(argp, aa);
char *p = 0;
while ((p = va_arg(argp, char *)) != 0) {
cout << p << endl;
}
va_end(argp);
}

void fun2(char *aa, ...)
{
va_list argp;
va_start(argp, aa);
char *p = 0;
while ((p = va_arg(argp, char *)) != 0) {
cout << p << endl;
}
va_end(argp);
}

int main()
{
cout << "fun2" << endl;
fun2("a", "1", "2", (char *)0);
cout << "fun1" << endl;
fun1(a(), "1", "2", (char *)0);
getchar();
}

fun2 一切正常。然而,fun1 只会崩溃。

我可以知道如何防止崩溃,同时能够使用类引用作为第一个参数。

目前,它打印:

fun2
1
2
fun1

然后崩溃。

我愿意

fun2
1
2
fun1
1
2

最佳答案

您不能将引用参数用作 va_start 的最后一个命名参数。原因是因为 va_start 使用命名参数的地址来查找其余参数的位置。但是,获取引用的地址给出了引用指向的变量的地址,而不是参数本身的地址。您的选择是:

1) 将变量类型从引用更改为指针(如果您对传入变量的拷贝没有问题,则更改为非引用)。

2) 添加一个额外的必需参数,以便引用不是最后命名的参数。附加参数可以是有用的参数,例如您要传递给特定函数的 char* 之一,也可以是您忽略的虚拟变量。

3) 改变va_start的定义。不推荐,但你可以这样做。参见 http://support.microsoft.com/kb/119394用于不可移植的重新定义。

关于c++ - 以类引用作为第一个参数的可变参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2106786/

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