[英]Passing part of a va_list
我将如何传递va_list的一部分或将其复制到从第n个元素开始的另一个va_list中?
int main (int x, char**argv) {
va_list clientArgs;
va_copy(clientArgs, argv[3]); // get all input parameters after 3rd cmd line arg
foo(clientArgs);
va_end(clientArgs);
....
还是使用va_copy方法...?
任何代码都不是可移植的,甚至不能保证正常工作(未定义的行为等)
但是,如下面的代码所示,这是可能的:
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <stdarg.h>
void VarShowArgs(int n, va_list args)
{
for(int i=0; i<n; ++i)
{
printf("Arg #%d: %d\n", i+1, va_arg(args, int));
}
}
void ShowArgs_StartAtFourthParam(int n, ...)
{
va_list args;
int dummy;
va_start(args,n); // n is param #1 (value = 8)
dummy = va_arg(args, int); // Remove Param #2 from args (value = 1)
dummy = va_arg(args, int); // Remove Param #3 from args (value = 2)
// Show arguments starting at Param #4 (which should be value = 3)
VarShowArgs(n - 2, args); // Minus 2 because we removed 2 params from the args.
va_end(args);
}
int main(void)
{
// First param says how many more args there will be.
// This function shows the values starting at the 4th argument (value = 3)
ShowArgs_StartAtFourthParam(8, 1, 2, 3, 4, 5, 6, 7, 8);
getch();
return 0;
}
产量
Arg #1: 3
Arg #2: 4
Arg #3: 5
Arg #4: 6
Arg #5: 7
Arg #6: 8
您是什么意思“ va_list的一部分”? 这个问题并没有多大意义。
va_list
是一个迭代器对象,它允许您一次遍历一个函数的参数va_start
将其初始化为指向当前函数的特定参数之后的参数,而va_arg
获取(复制)当前指向的参数参数并将其递增以指向下一个参数。
va_list
在任何情况下都不会封装参数列表-它只是引用参数列表的抽象指针式对象。
您可以将指向va_list
对象的指针传递给其他函数,并使该函数调用va_arg
来处理某些参数。 返回后,您可以调用va_arg
来处理更多参数,但这并没有真正复制参数列表。
您可以使用va_copy
复制va_list
,以使两个迭代器遍历参数列表。 然后,每个参数都是独立的,因此每个参数都将在va_copy
完成后看到所有参数。
除了引用作为参数传递给当前函数的参数外,无法创建引用任何其他内容的va_list
对象...
您不能直接这样做。 va_start
的第二个参数应该是函数参数列表中省略号(...)之前的最后一个参数的名称。 使用其他任何东西最多只能导致未定义的行为。
为了能够大致了解所需内容,您必须知道va_list
。 您可以使用va_arg()
读取它们,然后将va_list
的剩余内容传递给其他函数:
void function(int arg1, char *arg2, ...)
{
va_list args;
va_start(args, arg2);
int i = va_arg(args, int);
double d = va_arg(args, double);
foo(args);
va_end(args);
}
显然,如果变量列表中的参数都是相同的类型,则可以使用循环来迭代前N个此类参数。 注意,没有办法找出提供了多少个参数。 您的代码必须“知道”。 例如, printf()
使用格式字符串告诉它提供了多少个参数(以及每个参数的类型)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.