目录
一.使用可变参数
1.提供一个使用省略号的函数原型
2.在函数定义中创建一个va_list类型的变量
3.用宏把该变量初始化为一个参数列表
4.用宏访问参数列表
5.使用宏完成清理工作
二.va_copy
三.实例
一.使用可变参数
该头文件提供类似接受可变数量参数的宏,步骤如下(一共5步):
1.提供一个使用省略号的函数原型
void f1(int n,…);
int f2(cost char * s,int k,…);
这种函数的原型应该有一个形参列表,气质至少有一个形参和一个省略号(省略号必须在最后,比如Int f2(cost char * s,int k,…,int a);因为省略号后面还有int a所以是错误的)
而最右边的形参(省略号的前一个形参)则有一个特殊的作用,标准中用parmN这个术语来描述形参。
在上面我们具的例子中f1()中的parmN为n,f2()中的parmN为k。
传递给该形参的实际参数是省略号部分代表的参数数量
F1(1,200,400) //多了两个额外参数
2.在函数定义中创建一个va_list类型的变量
声明在stdarg.h中的va_lit类型代表一种用于存储形参对应的形参列表中省略号部分的数据对象。
Double sum(int lim,…){
Va_list ap; //声明一个存储参数的对象
3.用宏把该变量初始化为一个参数列表
使用声明在stdarg.h中的va_start()宏,把参数列表拷贝到va_list类型的变量中。该宏有两个参数:va_list类型的变量和parmN形参
Double sum(int lim,…){
Va_list ap; //声明一个存储参数的对象对应的我们使用
Va_start(ap,lim)
4.用宏访问参数列表
使用声明在stdarg.h中的va_arg()。该宏接受两个参数,一个va_list类型的变量和一个类型名。第一次调用va_arg()时,它返回参数列表的第一项;第二次调用返回第二个项,一次类推。标识类型的参数指定了返回值的类型
double tic;
int toc;
tic = va_arg(ap,double);
toc=va_arg(ap,int);
这里需要在知道传入的参数类型必须与宏参数的类型相匹配。
5.使用宏完成清理工作
使用va_end完成清理工作
va_end(ap);
调用va_end(ap),只有用va_start重新初始化ap后,才能使用变量ap
二.va_copy
因为va_arg()不提供退回之前参数的方法,所以有必要保存va_list类型变量的副本。C99新增了va_copy()宏处理这种情况,该宏接受两个va_list类型的变量作为参数,它把第二个参数拷贝给第一个参数
va_list ap;
va_list apcopy;
va_start(ap,lim);
va_copy(apcopy,ap) //把apcopy作为ap的副本此时,即使删除了ap,也可以从apcopy中检索参数
三.实例
代码原码:
#include <stdio.h>
#include <stdarg.h>
double sum(int,...);
int main(){
double s,t;
s = sum(3,1.1,2.5,13.3);
t = sum(6,1.1,2.1,13.1,4.1,5.1,6.1);
printf("return value for sum(3,1.1,2.5,13.3): %g\n",s);
printf("return value for sum(6,1.1,2.1,13.1,4.1,5.1,6.1): %g\n",t);
return 0;
}
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); //由lim控制,不断访问ap参数列表的参数
va_end(ap); //清空工作
return tot;
}
好了朋友们我们今天的内容到这就结束了,今天的内容到这里就结束了,如果有啥不会的朋友记得论坛里面提问哈~
如果朋友你感觉文章的内容对你有帮助,可以点赞,关注文章和专栏以及关注我哈,嘿嘿嘿我会定期更新文章的,谢谢朋友你的支持哈