对可变参数的使用作个总结,以免忘记:
针对MSC VC编译器进行分析:
先看看宏:
#ifdef __cplusplus
#define _ADDRESSOF(v) ( &reinterpret_cast<const char &>(v) ) //c++中获取变量地址的值
#else
#define _ADDRESSOF(v) ( &(v) ) //c中获取变量地址的值
#endif
//获取变量的尺寸(单位是字节),以int类型的长度为基准,32位下为4。
#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
//使ap指向第一个可变参数
#define _crt_va_start(ap,v) ( ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) )
//ap先指向下一个可变参数(ap += _INTSIZEOF(t)),然后再返回当前可变参数的值
#define _crt_va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
//将ap指针置0
#define _crt_va_end(ap) ( ap = (va_list)0 )
明白了这些,再去使用va_start,va_arg,va_end那就不在话下了,以后有时间补充一个例子。