编写一个可以接受C中任意数量参数的函数

时间:2015-09-23 06:47:21

标签: c function

#include <stdarg.h>
#include <stdio.h>

double average ( int num, ... )
{
    va_list arguments;                     
    double sum = 0;
    int x;
    /* Initializing arguments to store all values after num */
    va_start ( arguments, num );        
    //printf("arguments = %d...........num = %d",arguments,num);
    for(x = 0; x < num; x++ )        
    {
        sum += va_arg ( arguments, double ); 
    }
    va_end ( arguments );                  // Cleans up the list
    return sum / num;                      
}

int main()
{
   printf( "Average 2 = %f\n", average ( 3, 12.2, 22.3, 4.5 ) );
   printf( "Average 3 = %f\n", average ( 5, 3.3, 2.2, 1.1, 5.5, 3.3 ) );
   printf( "Average 4 = %f\n", average ( 9, 3.3, 2.2, 1.1, 5.5, 3.3, 
       3.10, 13.3, 143.312, 39.35 ) );
}

我们正在使用: - va_start ( arguments, num );

  

这里包含的参数是什么?我对此很困惑。   当我试图打印它时,我没有得到我作为参数传递的值。请解释

1 个答案:

答案 0 :(得分:0)

关于您的问题:您不应该关心arguments真正包含的内容,因为这取决于您的主机架构和编译器的实现。通常,它可以是指向堆栈上可以找到下一个参数的位置的指针,但它也可以是其他任何东西。

va_list及其周围的宏背后的想法是提供一致的API,您可以在任何架构上使用以相同的方式来获取参数,而无需知道如何他们在内部处理。 va_list因此就是你所说的黑匣子(通过它的API使用它,不要看里面)。只需依靠va_init()va_arg()从中获取参数。