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)
对于这些宏,存在着两个基本限制:
第一、这些宏无法判断实际参数的个数
第二、这些宏无法判断实际参数的类型
第三、宏定义的引入给调试带来了困难
综上所述,尽量用重载代替可变参数列表