如何填写va_list

如果我有一个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); } 

现在你可以通过调用例如call_foo(1,2,3,4);,call_foo(1,1,“Hello”)来调用foo ,它接受va_list,但是你喜欢它。 等等

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

通常,这些function成对出现。 如果你有一个“va-accepting”function,很容易创建另一个:

 void printInts_v(int n, va_list ap) { unsigned int i=0; for(i=0; i 

这个函数可以这样调用:

 void printInts(int n,...) { va_list ap; va_start(ap, n); printInts_v(n, ap); va_end(va); } 

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

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

我不认为这是一种标准化的方法。 另一方面,这样一个预先填充的va_list将毫无用处,因为无法对可用参数的数量和类型进行“查询”。