C可变参数列表

C语言的可变参数列表通过stdarg.h头文件中定义的stdarg宏来实现的,这个头文件什么了一个类型va_list和三个宏va_start、va_arg、va_end。可变参数就是通过这几个来实现的。下面给出代码,通过VS2008编译。

 

#include <iostream>
#include <string>
#include <stdarg.h>

float average(int n_values,...)//n_values 是参数个数
{
    float sum=0;
    va_list var_arg;/*define arguments list*/

    /* visit argument list*/
    if (n_values==0)
    {
        return -1;
    }
    va_start(var_arg,n_values);
    for ( int i = 0;i<n_values;++i)
    {
        sum+=va_arg(var_arg,int);
    }
    va_end(var_arg); /*end of argument calculate*/

    return sum/n_values;
}
int main(void)
{
    std::cout<<average(2,3,7)<<std::endl;
    system("pause");
    return 0;
}

 OUTPUT:5

分析:

MSDN对va_list和三个宏va_start、va_arg、va_end是这样定义的:

type va_arg( va_list arg_ptr,
      type 
); void va_end( va_list arg_ptr 
); void va_start( va_list arg_ptr 
);  // (UNIX version)
void va_start( va_list arg_ptr,
      prev_param 
); // (ANSI version)

 

对于这些宏,存在着两个基本限制:

第一、这些宏无法判断实际参数的个数

第二、这些宏无法判断实际参数的类型

第三、宏定义的引入给调试带来了困难

综上所述,尽量用重载代替可变参数列表

你可能感兴趣的:(c,可变参数列表)