64,662
社区成员
发帖
与我相关
我的任务
分享
#define va_end(arg) // 空的宏,木有效果
#define va_arg(arg,type) *(type*)arg;
//一条解引用语句而已。。你确定没有少了一个反斜杠?
arg = (char*)arg+sizeof(type) ;
//把arg化为字符指针,加上一个sizeof,去栈上取值。
#define va_start(arg,start) arg=(va_list)(((char*)&start))+sizeof(start))
//取得start的地址,加上sizeof(start),取得start后面一个参数的地址,赋值给arg
1. va系列的东西都是平台相关的,不必太过纠结
2. printf族函数是不定参数的。解析字符串,每碰到一个%d等token,调用一次va_arg,进行格式化,调用底层函数输出。
3. 由于不定参数函数都是_cdecl的,所以,可以保证自右向左压栈。
4. 由于不定参数函数无法进行类型检查,所以,必发生提升。char->int;short->int;float->double等
5. 尽量减少使用不定参数函数。