实现工具头文件:stdarg.h
- 变参宏:
…
和__VA_ARGS___
把宏参数列表中最后的参数写省略号(…)实现接受数量可变的参数;__VA_ARGS__则用在替换部分中,表明省略号代表什么,如
#define PR(…) printf(__VA_ARGS__)
○ 注意省略号只能代替最后的宏参数,如
#define WRONG(X,…,Y)
是错误的。
- 变参函数
实现步骤(需要手动实现)
i. 提供一个使用省略号的函数原型
(1) 至少有一个形参,省略号必须在最后ii. 在函数定义中创建一个
va_list
类型的变量
iii. 用宏把该变量初始化为一个参数列表
(1) 宏:va_start(va_list, parmN)
(2) parmN是可变参数的个数,一般通过函数固定形参传递iv. 用宏访问参数列表
(1) 宏:va_arg(va_list, 类型名 )
(2) 类型名指定了返回值的类型
(3)第一次调用返回参数列表的第1项,第二次调用返回参数的第2项,以此类推)v. 用宏完成清理工作
(1)va_end(va_list)
(2) 调用之后,va_list
变量只有用va_start
重新初始化后才能使用
(3) 所以如果需要退回之前参数,需要保留va_list
变量的副本,可以使用va_copy(va_list,va_list)
宏来处理。把第2个参数拷贝给第1个参数。
例子:
double sum(int lim, ...)
{
va_list ap; // 声明一个对象储存参数
double tot = 0;
int i;
va_start(ap, lim); // 把ap初始化为参数列表
for (i = 0; i < lim; i++)
tot += va_arg(ap, double); // 访问参数列表中的每一项