由于已经有很多的相关资料,本文不赘述 关于可变参数列表 和va_start,va_end,va_list的简单应用,直接进入正题。
1、va_list是如何实现指向下一个参数的
请大家先看一个很简单例子,但是实现了va_list 的基本功能:
#include
#include
void fun(int cnt, ...)
{
int *temp = &cnt;
int i;
temp++;//地址增加,指针指向下一个参数
for (i = 0; i < cnt; ++i)
{
printf("%d",(*temp));
temp++;
}
}
int main()
{
fun(4,33,2,11,0);
return 0;
}
想搞明白va_list 是怎么工作的,我们必须先搞明白C语言中,函数调用时是通过栈来实现的,而参数是连续存放的。比如例子中的 fun(4,33,2,11,0);的第一个参数 4,指向参数4的指针地址自增之后,就指向了第二个参数 33,以此类推。同样的,va_list实现原理也是类似的。怎么样,是不是很简单。
程序运行结果:
2、va_list 的缺陷
笔者认为va_list 的缺陷是很明显的,其无法判断 返回值是不是应得的参数;
比如 上面的例子中 ,如果这样写 fun(5,33,2,11,0); 当其读取第五个参数时,会发生不可预料的结果(这里用自己的函数来举例,和使用va_list也是类似的),这些结果可能不严重,也可能很致命,但确实是一个错误。
这种缺陷笔者目前也没有找到解决的方案,实在是很遗憾。比如C中的库函数printf,也存在着如此的缺陷;
当你如此调用时 printf(“%d,%d”,1);
运行结果:
2015-11-5 更新
笑斐戈