如何填写va_list

时间:2012-12-04 13:11:50

标签: c variadic-functions

如果我有一个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。

4 个答案:

答案 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作为参数,并将问题拆分为多个调用(并不总是可能的);或

  • 假设您要使用的框架设计不当...