将许多参数传递给C函数

如何将多个参数传递给C函数? 假设我有这个function:

void f(int n, char* a, char* b, ...) 

我想要一个未定义数量的char *参数。 我怎么能这样做?

您需要的是可变数量的参数函数,您可以阅读: 9.9。 可变数量的参数是一篇优秀的论文教程。

一个简短的四点理论将帮助您理解我的代码:

  1. 必须包含头文件,他引入了一个名为va_list的新类型,以及对这种类型的对象进行操作的三个函数,称为va_start, va_arg, and va_end
  2. va_start:是一个宏,用于将arg_ptr设置为可选参数的列表ap的开头
  3. va_arg:确实使用这个保存的堆栈指针,并为提供的类型提取正确的字节数
  4. 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 

我的代码的简要说明将有助于未来的用户:

  1. 实际上,函数是固定数量的参数,后跟可变数量的参数。 函数的最右边的参数(在我们的函数f() char* b固定参数列表中)仅使用初始化的可行列表ap
  2. 上面的函数f()读取n值为3在main中读取注释 )。 在f()while(n--)执行三次,每次使用va_arg()宏执行循环时,我们检索三个值。
  3. 如果你注意到我先读取两个ints然后是一个double char, int, float ,那么我发送char, int, float在main中我注意f() )。 这是因为在变量参数列表的情况下自动类型提升。 (从上面的lisk中详细阅读)

她是MSDN中另一个有用的链接: va_arg,va_end,va_start 。

如果您需要更多帮助,请告诉我

使用varargs(自己查看一下,被调用者用来读取args的东西在stdarg.h )。

请注意,被调用者无法自动确定实际传递的参数数量。 所以例如它可能是n ,你只需要信任调用者就可以了。