关于这个东西,是C语言里面灵活的体现。
通过这种定义方式,我们可以直接访问参数的传入堆栈,利用这样一个原理,就可以自如地写入多个参数。
但是危险性也是很明显的,我们必须自己控制,何时停止在堆栈上访问,很容易越界访问。
这里有非常详细的用法。
总结下来这几部分
头文件: #include<stdarg.h>
几个宏定义:
typedef char * va_list;
#define _INTSIZEOF(n) ((sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
#define va_end(ap) ( ap = (va_list)0 )
一个小例子。
///实际调用的函数,start是用来得到函数参数地址的,没有实际意义
int _fnAdd(int start,...)
{
///关于va_list va_start和va_end请参看相关资料,或者直接看stdarg.h也可以。
///比较好理解,只有一点,最上面那个
///define是为了字节对齐用的。其实没有什么意义。
///如果做成template,把va_arg中的int和返回的sum的类型参数化,就更通用了
va_list arg_ptr;
int sum=0,t=0;
va_start(arg_ptr,start); ///得到参数表的首地址
while(t=va_arg(arg_ptr,int))
sum+=t;
va_end(arg_ptr); ///把arg_ptr=NULL
return sum;
}