这是我第一次使用va_list
和其他东西,所以我真的不知道自己在做什么。好吧,基本上我所拥有的是一系列数字(1,2,3,4,5),在命令功能中,我让它们打印出来。这很好。
#include <iostream>
#include <cstdarg>
using namespace std;
void ordered(int num1, double list ...);
void main()
{
ordered(5, 1.0, 2.0, 3.0, 4.0, 5.0);
}
void ordered(int num1, double list ...)
{
va_list arguments;
va_start(arguments, num1);
list = va_arg(arguments, double);
cout << "There are " << num1 << " numbers" << endl;
do {
cout << list << endl; // prints out 1 then 2 then 3 then 4 then 5
list = va_arg(arguments, double);
} while (list != 0);
// at this point, list = 0
va_end(arguments);
}
问题是,在va_end(arguments);
之后或之前,我想让程序第二次打印出我的清单;基本上再次打印出1,2,3,4,5,而不进行其他功能。我试图复制代码:
va_start(arguments, num1);
do {
cout << list << endl;
list = va_arg(arguments, double);
} while (list != 0);
va_end(arguments);
没有成功。程序如何再次重复list
,或者是否无法在同一函数中再次执行此操作?
答案 0 :(得分:4)
这是一个有效的实施方案:
#include <iostream>
#include <cstdarg>
using namespace std;
void ordered(int num1, ...); // notice changed signature
int main(int,char**)
{
ordered(5, 1.0, 2.0, 3.0, 4.0, 5.0);
return 0;
}
void ordered(int count, ...) // notice changed signature
{
va_list arguments;
va_start(arguments, count);
cout << "There are " << count << " numbers" << endl;
double value = 0.0;
// notice how the loop changed
for(int i = 0; i < count; ++i) {
value = va_arg(arguments, double);
cout << value << endl; // prints out 1 then 2 then 3 then 4 then 5
}
// at this point, list = 0
va_end(arguments);
va_list arg2;
va_start(arg2, count);
cout << "There are " << count << " numbers" << endl;
for(int i = 0; i < count; ++i) {
value = va_arg(arg2, double);
cout << value << endl; // prints out 1 then 2 then 3 then 4 then 5
}
// at this point, list = 0
va_end(arg2);
}
答案 1 :(得分:3)
从手册页:
va_end()
va_start()
的每次调用必须与同一函数中va_end()
的相应调用相匹配。之后 调用va_end(ap
)变量ap未定义。多次遍历 该列表可以由
va_start()
和va_end()
括起来。
您是否可以显示尝试过的代码,但它无法正常工作?
NB。另请参阅va_copy
,您可以在(破坏性地)遍历它之前复制arguments
,然后遍历副本。
答案 2 :(得分:1)
简单的答案(忽略varargs如何工作,我发现很难找到printf
之外的有效用例)是自己复制参数。好吧,实际上一个更简单的答案就是根本不使用varargs ...为什么不传递容器(或者使用initializer_list
传递给C ++ 11?)