今天看到vc_list这套东西,然后自己就根据它的行为实现一下,发现va_start/va_arg实现有点不太一样的地方。
#define jc_list char*
#define ja_start(list, v) list = (jc_list)(&v)//得到第一个可选参数之前的那个参数的地址
#define ja_arg(list, type) *((type*)(list += sizeof(type)))//得到第一个可选参数的值,取得下一个参数的地址
#define ja_end(list) list = 0;
#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )//第一个可选参数地址
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) //下一个参数地址
为何要这样设计呢?不是很清楚,有啥优点呢?