C语言可变参数实战
printf 是怎么做到接受任意多个参数的?答案是 stdarg.h 里的三件套:va_list、va_start、va_arg。写了一个按格式符消费可变参数的实验,还能顺便理解”参数是怎么传进去的”。
核心机制
1 | char *handle(char* format, ...) |
关键认知
va_arg(args, type) 的第二参数决定怎么”解读”栈上的数据——这正是下面这个实验的伏笔:同一个 4 字节,用 int 取和用 float 取,结果天差地别。可变参数函数没有任何类型检查,格式符和实参类型不匹配就是未定义行为,printf 的 %d 打印浮点数之所以乱码,就是这个原理。
另外可变参数从前往后逐个消费,参数个数全靠格式符约定——printf 的格式串就是一份”参数说明书”。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 寰宇体的世界!
评论
GiscusTwikoo
