可变参数可以让函数接受一个以上的任意多个参数,可变参数又是怎么实现的呢?
看看源码
定义一个指向参数个数的指针va_list.
_INTSIZEOF(n)这个宏用来求取变量所占内存空间的大小。假如n为int类型((4)+4 - 1&~((4) - 1 ))即7&~3
0011取反为1100按位与0111变成0100(4)。
_ADDRESSOF(v)就是(&v)。
完成一系列宏替换后:
va_start(ap,v)就是让指针va_list加上变量类型的大小即让指针指向函数可变参数列表的第一个可选参数。
va_arg(ap,t)后的括号较多,首先ap+=变量类型的大小是让指针跳到下一个参数,ap-变量类型的大小再强转为相应类型的指针并解引用
是为了让指针指向原来的参数并返回所指向的内容。
va_eng是为了将指针置无效。
知道了可变参数列表的实现的原理再来看一段代码
int avg(int n,...)
{
va_list arg;
int total = n;
int sum = 0;
va_start(arg,n);
while(n--)
{
sum += va_arg(arg,int);
}
return sum/total;
va_end(arg);
}
int main()
{
printf("avg = %d",avg(3,10,2030));
return 0;
}
用可变参数列表求取若干个数中的平均值。
首先va_list定义了一个指向个数的可变参数列表指针arg。
va_start(arg,n)是取地址arg强转为(char*)并加上int类型的大小,使指针指向第一个可选参数10。
va_arg(arg,int)取得每个参数,sum+=va_arg(arg,int)求得所有参数的和。
所有数的和除以参数的个数就能得到平均值了。
va_end(arg)将指针arg置为无效。
这就是可变参数的实现啦。