2013-04-05 72 views
1

如何将多个参数传递给C函数? 假设我有这样的功能:将许多参数传递给C函数

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

我想炭*参数未定义的数量。我该怎么做?

+1

你需要做一个可变参数函数,见http://stackoverflow.com/questions/2735587/in-ac-function-declaration-作为最后一个参数做什么 – Joe 2013-04-05 09:45:17

回答

3

你需要什么叫做可变数量的参数函数,你可以阅读:9.9. Variable numbers of arguments一个很好的和作文的教程。

四点一短理论将帮助你理解我的代码:该操作

  1. <stdarg.h>头文件必须包括在内,他引入了一个新 类型,叫做的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 <stdarg.h>  
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. 实际上函数是固定数量的参数,后面跟着变量 参数个数。和最右边的参数功能(在固定的 参数列表中,即char* b在我们的功能f()中)仅使用 初始化可行列表ap
  2. 上述拳头的功能f()读取n值,该值是3读取在主 注释)。在f(),while(n--)执行三个 时间和每个循环使用va_arg()宏我们检索三个 值。
  3. 如果你注意到我读前两个ints然后double,凡为我 我发送char, int, float通知主,我叫F())。 这是因为自动类型在可变参数列表的情况下提升。

她是来自MSDN的另一个更有用的链接:va_arg, va_end, va_start

让我知道你是否需要对此更多的帮助)

+1

我可以建议,为了证明传递参数的数量是基于你在代码中指出的'n = 3',那么三组参数''a',3,6.7f',''b',5,5.5f',''A',0,0.1'为结构指针形式:'fun(2,a,b,3, (struct foo){.aa ='a',.i = 3,.f = 6.7f},/ * newline here * /&(struct foo){.aa ='b',.i = 5,.f = 5.5f},/ * newline here * /&(struct foo){.aa ='A',.i = 0,.f = 0.1f});' – Sebivor 2013-04-05 10:25:16

+0

@modifiablelvalue是的,真的很不错建议人。但是对于OP我想保持简单的代码。我包含了不同的数据类型,因为我想演示一下'char'提升为'int','float'提升为'double'。只要。如果你正在编写一个像你一样的代码,然后把代码放在codepas上,并给我链接:) ..谢谢 – 2013-04-05 10:42:05

0

使用可变参数(自己查看,被调用者读取参数的参数在stdarg.h)。

请注意,被调用者无法自动确定实际传递的参数数量。因此,举例来说,它可能是n,你只需要相信来电者获得n的权利。