C语言可变参数编程
在c语言中使用变长参数最常见的就是下面两个函数了:
1 | int printf(const char *format, ...); |
那他们是怎样实现支持变成参数的呢?在使用变长参数的函数(这里假设是func)实现部分其实用到了stdarg.h
里面的多个宏来访问那些不确定的参数,它们分别是:
1 | void va_start(va_list ap, last); |
假设lastarg是func的最后一个具名参数,即在func函数定义中…之前的那个参数(在printf中lastarg是format),在func中首先定义一个变量:
1 | va_list ap |
这个变量以后会依次指向各个可变参数。ap在使用之前必须用宏va_start初始化一次,如下所示:
1 | va_start(ap, lastarg); |
其中lastarg是func中的最后一个具名参数。然后就可以用va_arg来获得下一个不定参数(前提是知道这个不定参数的类型type):
1 | type next = va_arg(ap, type) |
最后就是用宏va_end
来清理现场。
下面我们来自己实现一个可变参数的函数:
1 |
|
输出结果:
1 | 10 |
可以看到上面的程序完成按我们的意愿实现了变长参数的访问,通过前面的fmt来控制下一个不定参数的类型。那这三个宏是怎样实现对不定参数访问的呢?下面来看看它们是怎么实现的:
va_list实际就是一个指向各个不定参数的指针,由于参数的类型是不确定的,所以可以定义va_list为void *或者char *类型,即
1 |
|
va_arg获取当前不定参数的值,根据当前参数的类型的大小移动指针指向下一个不定参数。
1 |
va_end将指针清0。
1 |
本质上其实就是靠前面lastarg来控制不定参数的类型,va_list变量来指向不定参数的地址,然后根据lastarg一个一个的获取不定参数。
参考链接:https://www.cnblogs.com/chengxuyuancc/archive/2013/05/30/3107058.html
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 竹山一叶!
评论