最近在写一个简单的日志系统,需要输出信息到文件中,用到了可变参数,查阅有关资料后在此总结一下。
可变参数函数在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);