C语言中的可变参数用法

2014-11-24 01:04:14 · 作者: · 浏览: 5

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中可以搜索其宏定义。