如何填写va_list

Ram*_*uri 20 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);
} 
Run Code Online (Sandbox Code Playgroud)

因此,当我调用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
...
Run Code Online (Sandbox Code Playgroud)

我需要这个,因为有一个函数接受va_list作为参数,我不知道如何填充其所有参数的va_list.

nos*_*nos 19

没有明确填写va_list的能力.

你应该写一个包装函数.假设您需要调用函数foo,而不是手动填写va_list,您可以定义一个新函数,如下所示:

void call_foo(int arg1, ...)
{
   va_list ap;
   va_start(ap, arg1);
   foo(arg1, ap);
   va_end(ap);
}
Run Code Online (Sandbox Code Playgroud)

现在你可以通过调用foo例如call_foo(1,2,3,4);, call_foo(1,1,"Hello")来调用,这需要一个va_list,无论你喜欢什么.等等

这只允许您在编译时指定参数,不能在运行时构建参数.


glg*_*lgl 12

通常,这些功能成对出现.如果你有一个"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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这个函数可以这样调用:

void printInts(int n,...)
{
    va_list ap;
    va_start(ap, n);
    printInts_v(n, ap);
    va_end(va);
}
Run Code Online (Sandbox Code Playgroud)

但是我认为没有办法可以预先填写以va_list供以后使用.

如果您在一个架构上工作并且可移植性不是问题,那么您可以自己制作一些东西.具体做法是如何做到这一点.