va_系列函数包含va_start,va_arg,va_end,使用类型va_list。
其他使用va_list类型的函数有vprintf,vfprintf,vsprintf。
va是Variable Arguments的首字母缩写。
下面是一个毫无意义的函数,使用可变参数,只是演示了va_系列函数的用法。
void func( int first, ... ) {
va_list marker;
va_start( marker, first ); // 初始化marker变量
int next = va_arg( marker, int); // 根据当前参数
// 的字节数(即类型)取得下一个参数的地址,从而获得其值。
// 通过这种方法,可以获得下面的所有参数。当然,你得想办法
// 得知共有多少个参数。
va_end( marker ); // 这里重置marker(可能要释放空间吧,赐教)。
}
一个可能有意义的用法如下,自定义一个日志函数,可以做到格式化输出日志信息,灵活性较大。
这种函数在一些项目中很常见。
// 自定义的添加日志函数
void LogAppend( char * format, ... ) {
// 可以在这里先输出时间信息到文件中
va_list marker;
va_start( marker, format);
char buf[1024];
vsprintf( buf, format, marker);
// 最后将buf写入文件中
}
v系列函数只是将可变参数列表...替换成了va_list类型参数,如
vprintf对应于printf,他们的类型分别是:
int vprintf( char *, va_list);
int printf( char *, ...);
最后,va_list到底如何实现的呢?有兴趣的话在stdio.h中可以搜索其宏定义。