可變參數函數:需要包含的頭檔案
參數數目是可變的。比如 C 語言的 printf 系列的(格式化輸入輸出等)函數,都是參數可變的,形式是形參是三個點。 如printf 函數的聲明:
int printf ( const char * format, ... )
不過并不是所有的都應該如此,也可以像這樣:void show(int x,int y, ...);根據形式可知則至少需要兩個參數。那能不能這樣 void show(...),不能,因為我們需要根據第一個參數擷取整個參數清單的位址。具體下面詳解。
一般我們用可變參數都是這種形式,下面就用這個形式的舉例子 void show(const char* data,...)
可變參數函數的幾個宏:va_list va_start va_end va_arg
那怎麼得到并使用多個參數呢

首先,你需要在函數中定義一個va_list變量p,在此了解為一個指針。但是這指針現在還沒有指向東西(野指針)。
怎麼讓他指向我們的參數清單:用va_start(p,data),data是我們函數的第一個參數,調用這個宏之後,p指向了參數清單中data後的位置,擷取參數清單完成。
想擷取某個參數該如何,va_arg(p,類型);比如想擷取一個整形參數,可以這樣a=va_arg(p,int); 之前想怎麼知道有多少個參數,并沒有直接擷取有多少個參數的宏。
最後調用下:va_end(p)就行了。
OK,到此可變參數的基本用法已經講完。
項目中用到可變參數的不多,大多數是生成日志,報錯之類的。根據可變參數函數,生成日志檔案,一般用vfprintf,方法如下。當然這個時候第一個參數必須是參數格式字元串"%s %d "的,後面跟實際參數。寫入檔案流。
void LogMsg(char *strMsg, ...) { va_list aplist; FILE *fp; va_start(aplist, strMsg); fp = fopen("my.log", "a"); if (fp != NULL) { vfprintf(fp, strMsg, aplist); fclose(fp); } va_end(aplist); }