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