如果我有一个va_list,我知道如何提取其所有元素:
void printInts(int n,...)
{
va_list va;
va_start(va, n);
for(unsigned int i=0; i<n; i++)
{
int arg=va_arg(va, int);
printf("%d",arg);
}
va_end(va);
}
因此,当我调用printInts(3,1,2,3)时,va_list将填充所有参数 但是如何在不使用va_start的情况下手动填充va_list?我的意思是我想要这样的东西:
va_list va;
push_arg(va, int, 5); // And so on until I fill all parameters
...
我需要这个,因为有一个函数接受va_list作为参数,我不知道如何填充其所有参数的va_list。
答案 0 :(得分:18)
无法明确填写va_list。
你应该写一个包装函数。假设您需要调用函数foo,而不是手动填写va_list,您可以定义一个新函数,如下所示:
void call_foo(int arg1, ...)
{
va_list ap;
va_start(ap, arg1);
foo(arg1, ap);
va_end(ap);
}
现在你可以通过以下方式拨打foo
来接听一个va_list,无论你喜欢什么。 call_foo(1,2,3,4);, call_foo(1,1,“Hello”);等
这只允许您在编译时指定参数,不能在运行时构建参数。
答案 1 :(得分:10)
通常,这些功能成对出现。如果您有“va-accepting”功能,则可以轻松创建另一个功能:
void printInts_v(int n, va_list ap)
{
unsigned int i=0;
for(i=0; i<n; i++)
{
int arg=va_arg(ap, int);
printf("%d", arg);
}
}
可以这样调用此函数:
void printInts(int n,...)
{
va_list ap;
va_start(ap, n);
printInts_v(n, ap);
va_end(va);
}
但我认为有一种方法可以预先填充va_list
以供日后使用。
如果您在一个架构上工作并且可移植性不是问题,那么您可以自己制作一些东西。具体做法是如何做到这一点。
答案 2 :(得分:0)
我不认为这是一种标准化的方法。另一方面,这样一个预先填好的va_list
将毫无用处,因为它无法查询&#34;它可以用于可用参数的数量和类型。
答案 3 :(得分:0)
由于其他答复表明这是不可能的(这是将其添加到下一版本的语言设计中的一个很好的理由),因此唯一可移植的可能性是
两次检查文档以调查您是否没有错过或 误解了您要使用的框架:I 遇到了完全相同的问题here,它出现在答案中 我没有正确地要求我做的事情;
编写一个函数,该函数将指针数组作为参数而不是va_list作为参数,并将问题拆分为多个调用(并不总是可能的);或
假设您要使用的框架设计不当...