将许多参数传递给C函数
如何将多个参数传递给C函数? 假设我有这个function:
void f(int n, char* a, char* b, ...)
我想要一个未定义数量的char *参数。 我怎么能这样做?
您需要的是可变数量的参数函数,您可以阅读: 9.9。 可变数量的参数是一篇优秀的论文教程。
一个简短的四点理论将帮助您理解我的代码:
- 必须包含
头文件,他引入了一个名为va_list的新类型,以及对这种类型的对象进行操作的三个函数,称为va_start, va_arg, and va_end
。 -
va_start:
是一个宏,用于将arg_ptr
设置为可选参数的列表ap
的开头 -
va_arg:
确实使用这个保存的堆栈指针,并为提供的类型提取正确的字节数 -
va_end:
是一个重置ap
的宏,在检索完所有参数后,va_end
将指针重置为NULL。
这个理论是不够的,但是在一个例子下(如你所要求的)将帮助你理解基本的工作流程和步骤:( 阅读每4个步骤的评论 )
//Step1: Need necessary header file #include void f(int first, char* a, char* b, ...){ va_list ap; // vlist variable int n; // number char aa, int i; float f; //print fix numbers of arguments printf("\n %d, %s, %s\n", first, a, b); //Step2: To initialize `ap` using right-most argument that is `b` va_start(ap, b); //Step3: Now access vlist `ap` elements using va_arg() n = va_arg(ap, int); //first value in my list gives number of ele in list while(n--){ aa = (char)va_arg(ap, int); // notice type, and typecast i = va_arg(ap, int); f = (float)va_arg(ap, double); printf("\n %c %d %f \n", aa,i, f); } //Step4: Now work done, we should reset pointer to NULL va_end(ap); } int main(){ char* a = "Aoues"; char* b = "Guesmi"; f(2, a, b, 3, 'a', 3, 6.7f, 'b', 5, 5.5f, 'A', 0, 0.1); // ^ this is `n` like count in variable list return 1; }
谁运行:
~$ ./a.out 2, Aoues, Guesmi a 3 6.700000 b 5 5.500000 A 0 0.100000
我的代码的简要说明将有助于未来的用户:
- 实际上,函数是固定数量的参数,后跟可变数量的参数。 函数的最右边的参数(在我们的函数
f()
char* b
固定参数列表中)仅使用初始化的可行列表ap
。 - 上面的函数
f()
读取n
值为3
( 在main中读取注释 )。 在f()
,while(n--)
执行三次,每次使用va_arg()
宏执行循环时,我们检索三个值。 - 如果你注意到我先读取两个
ints
然后是一个double
char, int, float
,那么我发送char, int, float
( 在main中我注意f() )。 这是因为在变量参数列表的情况下自动类型提升。 (从上面的lisk中详细阅读)
她是MSDN中另一个有用的链接: va_arg,va_end,va_start 。
( 如果您需要更多帮助,请告诉我 )
使用varargs(自己查看一下,被调用者用来读取args的东西在stdarg.h
)。
请注意,被调用者无法自动确定实际传递的参数数量。 所以例如它可能是n
,你只需要信任调用者就可以了。