可变参数函数,顾名思义就是函数的参数个数是不确定的,可以变化的。
可变参数函数见得比较多的就是字符串格式化输入输出函数了,
如标准输入函数scanf、标准输出函数printf等。
#include <stdio.h>
int scanf(const char *format, ...);
int printf(const char *format, ...);
可以实现可变参数函数的原因是头文件stdarg.h中定义了几个宏,包括:
va_list/va_start/va_arg/va_end/va_copy
关于stdarg.h头文件,一开始在系统常规路径/usr/include以及/usr/lib/下面竟然都没有查到。
所以使用find命令来帮忙查找:
sh-# find /usr/include/ -name "stdarg.h"
sh-# find /usr/lib/ -name "stdarg.h"
这几个宏的定义方法如下:
typedef char* va_list;
va_start用来获取第二个参数的地址,即可变参数列表中第一个参数的地址,
#define va_start(ap, v) (ap = (va_list)&v ++ _INTSIZEOF(v));
va_arg用来获取可变参数列表中的当前参数,
#define va_arg(ap, t) (*(t*)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)))
va_end用来清空va_list的可变参数列表
#define va_end(ap) (ap = (va_list)0)
关于可变参数函数,除了这些字符串输入输出相关的库函数外,使用的场合并不多。
这里就先做个了解吧。