说来也比较奇怪.以前读代码的时候,总是囫囵吞枣的样子,遇到不懂的东西,总是一带而过.没有把它们认真的弄明白.我深知自己有这种偷懒的缺点.但是总是无法控制自己一错再错.昨天ken还不厌其烦的给我鼓励.今天我稍微的认真了一把,便发现了va_list/va_start/va_arg/va_end等函数,我不明白.
于是便找了一些资料.让自己彻底的弄清楚这些东西是干吗用的!
下面我说说我对它们的理解!
在ANSI C标准中,va的宏定义在stdarg.h中,它们有:va_list,va_start,va_arg,va_end,va_copy,等家族成员.下面我用我看到的一个例子结合我自己的理解来描述一下这些函数的具体功能.
求任意个自然数的平方和:
/*************************
*int SqSum(int n1, …)
*{
*va_list arg_ptr;
*int nSqSum = 0, n = n1;
*
*va_start(arg_ptr, n1);
*while (n > 0)
*{
* nSqSum += (n * n);
* n = va_arg(arg_ptr, int);
*}
*va_end(arg_ptr);
*
*return nSqSum;
*}
**// 调用时
**int nSqSum = SqSum(7, 2, 7, 11, -1);
*******************************/
这个函数的具体执行是这样的:
1.va_list arg_prt 先定义了一个指向可变参数列的参数arg_ptr;
2.va_start(arg_ptr,n1)表示开始对可变参数进行解析;
3.n = va_arg(arg_ptr,int)表示将当前可变参数指针指向下一个可变参数,并将其以int形式返回给n;
4.当遇到n<0的情况,便退出循环.
5.va_end(arg_ptr)停止解析,将可变参数指针清空.
# 6.va_copy(dest, src):dest,src的类型都是va_list,va_copy()用于复制参数列表指针,将dest初始化为src.
也就是说va家族更加方便了可变参数函数的使用.
也不知道我的理解是否贴切,希望大家给予指正!
共同学习.