【原型】
type fun( type arg1, type arg2, ... );
【描述】
主要用在参数个数不确定的函数中,例如:printf函数。
【使用方法】
参考:glib/manual/Add.c
运行结果:
16
55
【实现分析】
如果要实现可变参数,关键是我们怎样遍历函数列表 ,这就牵扯到函数的参数链表在栈中的存放顺序问题:
函数入栈的过程大致如下: (更详细的内容参考这里 )
- 函数的局部变量入栈;
- 其他被调函数信息指针入栈;
- 函数返回地址入栈;
- 参数列表入栈,顺序从右到左;
此时我们可以明确参数列表的存放顺序,如下:
所以我们必须要知道栈顶参数地址,即函数的第一个参数;
主要依靠定义在stdarg.h中三个宏:
- void va_start( va_list arg_ptr, prev_param ); /*给出第一个参数的地址*/
- type va_arg( va_list arg_ptr, type ); /*从第二个参数开始取,每次返回一个*/
- void va_end( va_list arg_ptr ); /*标记已取完,其实什么也不做*/
stdarg.h的实现和注释如下:
其实stdarg.h的实现会依据编译器的不同有所差异,了解更多查看这里 。
【例子分析】
这个例子我们可以修改一下glib/manual/Add.c 如下:add_ex.c
运行结果: GCC和vc的编译结果有差异。
转载请声明来处:http://blog.csdn.net/oncoding/archive/2009/09/13/4549160.aspx