C语言中的可变参数用法

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/c284a330284563b8b1126e7c35e451a8.html