1、原理
函数调用时,传递的参数会在栈(内存)中形成参数列表,这就给我们取参数提供的依据;
2、条件
可变参函数的使用时需要包含 标准可变参头文件
#include <stdarg.h>;
可变参函数格式为: func(有名参数, …)
,有名参数必须至少要有一个(用于编译器做检查),可变参数固定为三个点 …
;
3、过程(库函数原理)
① 定义一个可变参指针
va_list va_ptr;
va_list 的原型为: typedef char *va_list)
② 指明第一个变参地址
va_start(va_ptr, lastArg);
lastArg 为最后一个带名字的参数,这使得 va_Ptr 指向第一个变参地址,其原理为:
#define va_start(va_ptr, lastArg) va_ptr = &lastArg + 1;
③ 取参:
va_arg(va_ptr,type);
取出当前变参,并使 va_ptr 指向下一个变参, 其原理为:
#define va_arg(va_arg, type) (type *)(va_ptr = vaPtr+sizeof(type))[-1];
④ 结束:
va_end(va_ptr);
原理为: va_ptr = NULL;
4、传参隐式提升:
char 会被提升为 int 型;
float 会被提升为 double 型;
short int 会被提升为 int 型;
所以输入取参类型时 char 要改为 int、float 要改为 double、 short int 要改为 int。