让函数能缩能伸--可变参数函数
【摘要】 我们来假设一种情景:有一个点餐的函数,它接收菜品名作为参数,当客人点一个菜时就传递一个参数,但是客人点的数量都不一样,有的多有的少,显然固定的参数个数是无法适应这种变化的。那该怎么办呢?
如果大家对printf()函数还有印象的话,那么就知道它接收参数的数量是可变的。它是如何做到的呢?其实它要用到可变数量参数。参数数量可变的函数,我们称其为可变参数函数。C标准库中有一...
我们来假设一种情景:有一个点餐的函数,它接收菜品名作为参数,当客人点一个菜时就传递一个参数,但是客人点的数量都不一样,有的多有的少,显然固定的参数个数是无法适应这种变化的。那该怎么办呢?
如果大家对printf()函数还有印象的话,那么就知道它接收参数的数量是可变的。它是如何做到的呢?其实它要用到可变数量参数。参数数量可变的函数,我们称其为可变参数函数。C标准库中有一组宏可以帮助我们创建可变参数函数,所以要加入处理可变参数函数的代码的头文件stdarg.h。事不宜迟,我们先来定义一个可变参数函数:
#include <stdarg.h> void print_ingredient(int args,...){ va_list ap; va_start(ap,args); int i; for(i = 0; i < args ; i++){ printf("Ingredient:%s\n",va_arg(ap,char*)); } va_end(ap);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
说明一下上面各部分的含义:
- 首先要加入头文件stdarg.h,这样才可以处理可变参数函数。
- 形参的第一个参数args,是要告诉函数后面跟的可变参数的个数,函数参数后面的省略号“…”表示还有更多参数。
- va_list用来保存传给函数除了args之外的其他参数。
- va_start(ap,args),中的agrs是告诉函数va_start()从哪个偏移位置开始读取可变参数,然后存入ap。
- va_arg(ap,int),va_arg()接收两个值:一个是va_list另一个是要读取参数的类型。
- va_end(ap);当va_arg()读完了所有参数,要用va_end()宏告诉C你完成了。
注意:va_end和va_start和va_arg都是宏,只是被设计成变通函数的样子,预处理会把它们替换成其他代码。
我们来看一个完整的运行实例:
#include <stdio.h>
#include <stdarg.h>
void print_ingredient(int args,...);
int main(){ print_ingredient(3,"cabbage","potato","tomato"); return 0;
}
void print_ingredient(int args,...){ va_list ap; va_start(ap,args); int i; for(i = 0; i < args ; i++){ printf("Ingredient:%s\n",va_arg(ap,char*)); } va_end(ap);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
编译运行:
~/Desktop/Mc$ gcc test1.c -o test1
~/Desktop/Mc$ ./test1
Ingredient:cabbage
Ingredient:potato
Ingredient:tomato
- 1
- 2
- 3
- 4
- 5
文章来源: blog.csdn.net,作者:WongKyunban,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/weixin_40763897/article/details/87443065
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)