如何填写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
将毫无用处,因为无法对可用参数的数量和类型进行“查询”。