有关可变参数函数的总结

最近在写一个简单的日志系统,需要输出信息到文件中,用到了可变参数,查阅有关资料后在此总结一下。

可变参数函数在c语言输出语句中非常常见,如printf函数,其原型为

int printf( const char * format, ... )

它除了有一个参数format固定之外,后面跟的参数个数和类型是可变的(c语言中用 ... 表示可变参数)

如何实现其功能?

头文件stdarg.h中定义了几个宏来帮助我们实现可变参数的功能:

va_list

定义了一个指针arg_ptr,指向可选参数

va_start(arg_ptr, argN)

使参数列表指针arg_ptr指向函数参数列表中的第一个可选参数,argN是位于第一个可选参数之前的固定参数,或者说最后一个固定参数。
va_arg(arg_ptr, type)

返回参数列表中指针arg_ptr所指的参数,返回类型为type,并使指针指向参数列表中下一个参数。返回的是可选参数,不包括固定参数

va_end(arg_ptr)

清空参数列表,并置参数指针arg_ptr无效


说明:

1、va_start与va_end是成对调用的

2、开始时调用va_start,获得各可选变量地址

3、结束时调用va_end,释放相应的资源


2.vsnprintf和snprintf

vsnprintf和snprintf是C语言printf家族函数的成员,相关函数列表如下

#include <stdio.h>
       int printf(const char *format, ...); //输出到标准输出
       int fprintf(FILE *stream, const char *format, ...); //输出到文件
       int sprintf(char *str, const char *format, ...); //输出到字符串str中
       int snprintf(char *str, size_t size, const char *format, ...); //按size大小输出到字符串str中

以下函数功能与上面的一一对应相同,只是在函数调用时,把上面的...对应的一个个变量用va_list调用所替代。在函数调用前ap要通过va_start()宏来动态获取。
#include <stdarg.h>
       int vprintf(const char *format, va_list ap);
       int vfprintf(FILE *stream, const char *format, va_list ap);
       int vsprintf(char *str, const char *format, va_list ap);
       int vsnprintf(char *str, size_t size, const char *format, va_list ap);







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值