c - 如何填写 va_list

标签 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。

最佳答案

无法显式填充 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, "你好");等

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

关于c - 如何填写 va_list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13703770/

相关文章:

Java:使用显式子类数组调用 Vararg 方法

c++ - 如果输入字符串包含 "%",vsntprintf_s 会崩溃

在 C 中将 4 个字节的 char 转换为 int32

android - 交叉编译 Android 和依赖项

c - 如何将可变参数传递给接受可变参数的函数?

c++ - 调用可变参数宏的可变参数函数

控制可能到达非空函数的结尾 [-Wreturn-type]|

可以通过 openMP 加速生产者/消费者(有界缓冲区)吗?

带有 "..."数组的 Java 主要方法?

java - 使用可变参数重载函数