定義不定參數函數,要用到下面這些宏:html
C語言裏編寫不定參數函數的形式是這樣的:架構
#include <stdarg.h> int sum(int cnt,...) { int sum = 0; int i; va_list ap; va_start(ap, cnt); for(i = 0; i < cnt; ++i) sum += va_arg(ap, int); va_end(ap); return sum; }
定義不定參數函數,要用到下面這些宏:函數
stdarg.h
裏。typedef char * va_list; #define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) #define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) ) #define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) #define va_end(ap) ( ap = (va_list)0 )
注意: 上面這些宏定義會因不一樣的系統和不一樣的處理器架構而不一樣code
不定參數函數最經常使用來格式化字符串,一個比較常見的場景是咱們想輸出一些log消息,但又不能直接在控制檯輸出,須要本身寫一個log函數來格式化log消息並輸出。這時咱們能夠用vsprintf函數:orm
void log(const char *format, ...) { char buf[MAX_BUF_SIZE]; va_list ap; va_start(ap, format); vsprintf(buf, format, ap); OUTPUT(buf); }
vsprintf函數的前兩個參數和sprintf的前兩個參數意義相同,只不事後面的不定參換成了va_list類型的參數列表,這正是讓咱們用來定義本身的格式化函數的。htm
https://www.cnblogs.com/luzhlon/p/7087080.htmlblog