将许多参数传递给C函数

时间:2013-04-05 09:42:16

标签: c function arguments

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

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

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

2 个答案:

答案 0 :(得分:3)

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

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

  1. 必须包含<stdarg.h>头文件,他介绍了一个新文件 type,称为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。
  5. 这个理论是不够的,但是在一个例子下(如你所要求的)将帮助你理解基本的工作流程和步骤:( 阅读每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* bf()的参数列表仅使用 初始化可行列表ap
    2. 上面的函数f()读取n 3的值{<1}} 主要评论)。在f()中,while(n--)执行三次 时间和每次循环使用va_arg()宏我们检索三个 值。
    3. 如果你发现我先读了两个ints,那么就是double,我在哪里 我发送char, int, float通知我在主叫我f()的地方。 这是因为在变量参数列表的情况下自动类型提升。 (从上面的lisk中详细阅读)
    4. 她是来自MSDN的另一个有用的链接:va_arg, va_end, va_start

      如果您需要更多关于此的帮助,请告诉我们)

答案 1 :(得分:0)

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

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