天天看點

c語言list函數參數,C語言可變參數函數詳解 va_list va_arg va_start宏

可變參數函數:需要包含的頭檔案

參數數目是可變的。比如 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

那怎麼得到并使用多個參數呢

c語言list函數參數,C語言可變參數函數詳解 va_list va_arg va_start宏

首先,你需要在函數中定義一個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); }