Linux编程每周一讲 -可变长度参数

可变长度参数在C语言里面不算什么新鲜的东西,但是它的应用范围很广,属于基础知识范围,因此将这个话题做为系列文章中的第一篇比较合适。 什么是可变长度参数呢?拿printf()来举例:
printf("This is an integer: %d, That is a float: %s", 1, 2.0);

在上面的例子里,printf()接收三个参数,第一个是要打印的字串,里面有两个参数: 

* %d 

* %s 

后面是这两个参数对应的实际值: 

* 1 

* 2.0 

在上面的例子里,printf()接收了三个参数。再看下面这个例子:

printf("Hello, world!");
printf()这次只接收了一个参数。换言之,printf()接收的参数个数是*可变的*。这是如何实现的呢?在C语言里面,我们可以在函数定义时使用 "..." 来定义可变长度参数,比如:
a_function(int i, ...);

先将固定参数写在最前面,后面再用"..."来声明这个函数接收可变长数参数。 然后,我们在函数内部使用stdarg.h里面定义的一个struct和几个宏来实现对可变长度参数的读取: 

* va_list 

* va_start() 

* va_arg() 

* va_end() 

这个几东西的使用方法非常简单,在stdarg.h的manpage里面说明的很详细。查看stdarg.h的manpage可用下面的命令:

man 3 stdarg
里面有这样一段说明:

The va_start() macro must be called first, and it initializes ap, which can be passed to va_arg() for each argument to be processed. Calling va_end() signals that there are no further arguments, and causes ap to be invalidated. Note that each call to va_start() must be matched by a call to va_end(), from within the same function.

简单翻译一下,就是首先调用va_start(),然后初始化ap,之后使用va_arg()来处理可变长度参数。最后,使用va_end()来清理ap。 我制作了一个实际的例子,放在了github上面:
https://github.com/liweinan/learnc/blob/master/stdarg.c
关于这个代码,有些要说明的地方: * 这里面有两个可变长度参度的函数:一个是求平均数的average(),另一个是模拟printf的min_printf() * average()这个函数想说明的是:第一个固定参数在实际应用时是必不可少的,需要它的配合来使用后面的参数。 * min_printf()这个函数想说明的是: 如何使用第一个固定参数里面的值配合读取后面可变长度参数的数据类型。 代码里面的说明已经很详细,可以仔细看下。下面是这个例子的使用方法: 首先从git迁出代码:
git clone git://github.com/liweinan/learnc.git
然后编译例子:
make stdarg.o
最后运行例子,下面是命令和输出结果:
% make play_stdarg
./stdarg.o
average: 2.300000
The ultimate answer of life is: 42
全文目录 http://bluedash.net/spaces/Linux编程每周一讲-目录

转载于:https://my.oschina.net/u/209431/blog/36104

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值