让函数能缩能伸--可变参数函数

举报
yd_221104950 发表于 2020/12/02 22:51:39 2020/12/02
【摘要】 我们来假设一种情景:有一个点餐的函数,它接收菜品名作为参数,当客人点一个菜时就传递一个参数,但是客人点的数量都不一样,有的多有的少,显然固定的参数个数是无法适应这种变化的。那该怎么办呢? 如果大家对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

说明一下上面各部分的含义:

  1. 首先要加入头文件stdarg.h,这样才可以处理可变参数函数。
  2. 形参的第一个参数args,是要告诉函数后面跟的可变参数的个数,函数参数后面的省略号“…”表示还有更多参数。
  3. va_list用来保存传给函数除了args之外的其他参数。
  4. va_start(ap,args),中的agrs是告诉函数va_start()从哪个偏移位置开始读取可变参数,然后存入ap。
  5. va_arg(ap,int),va_arg()接收两个值:一个是va_list另一个是要读取参数的类型。
  6. 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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。