C語言定義可變引數函式

2021-10-11 21:48:56 字數 1177 閱讀 9638

可變引數列表是通過stdarg.h標頭檔案內的stdarg巨集來實現的,stdarg.h標頭檔案是標準庫的一部分。在標頭檔案中宣告了乙個va_list型別,還有三個巨集--va_start、va_arg和va_end,在使用時需要先定義乙個型別為va_list的變數,與這幾個巨集配合使用,訪問引數值。

在函式內需要宣告乙個叫var_arg的變數,用於訪問引數列表的未確定部分。這個變數是通過呼叫va_start來初始化的。其第乙個引數是va_list變數的名字,第2個引數是省略號前最後乙個有名字的引數,初始化過程會把var_arg變數設定為指向可變引數部分的第乙個引數。

為了訪問引數,需要使用va_arg,這個巨集接受兩個引數:va_list變數和引數列表中下乙個引數的型別。在下面的程式中所有的可變引數都是整形。在有些函式中可能需要通過前面獲得的資料來判斷下乙個引數的型別。va_arg返回這個引數的值,並使var_arg指向下乙個可變引數。最後當訪問完最後乙個可變引數後,要呼叫va_end進行收尾。

可變引數必須從頭到尾按照順序逐個訪問。允許在訪問幾個可變變數引數後中途停止。但是無法從一開始就直接訪問引數列表中的引數。另外由於引數列表中的可變引數部分都沒有原型,所以所有作為可變引數傳遞給函式的值都將執行預設引數型別提公升。

va_list 用於定義乙個指向引數的指標,其實就是乙個char* 的指標。

va_start(v1, num); 將v1指標指向可變引數的第乙個引數。通過列印*v1可知,列印出來的是,1 ,正是第乙個可變引數。

res = va_arg(v1, int); 這個函式返回v1指標所指的值,並使v1指標

移動sizeof(int) = 4, 個位元組,使其指向下乙個引數。以前一直以為當引數型別為char 時,應該寫char, 但是今天實踐了一下發現,當為char時系統會自動提公升為int,當為float時自動提公升為double, 字串時為char * 。。。。…

va_end(v1); 最後一句,為了安全性,關閉v1指標,其實就是使v1為null。

#include#includevoid fun(int num, ...)

va_end(v1); //關閉v1指標,使其指向null

}int main(void)

C語言函式可變引數

翻apue的時候,看到了一組可變引數的巨集就是va list 類似 void print arg int count,1 va list變數 ifdef m alpha typedef struct va list else typedef char va list 這個 endif 2 intsi...

C語言可變引數函式

今天在c和指標書中第一次接觸到這個函式,以前有碰到過這樣可變引數的問題,但無從下手。原來c語言還是有這樣的功能,感覺c真是無所不能。c函式要在程式中用到以下這些巨集 void va start va list arg ptr,prev param type va arg va list arg pt...

C語言 可變引數函式

可變引數函式,即引數個數可變的函式。返回值 函式名 固定引數m個,可變引數n個 其中,m 1,n 0,即 至少需要乙個固定引數,否則你怎麼定位到引數呢?固定引數的宣告與普通函式引數相同 可選引數由於數目不定 0個或以上 宣告時用 表示 用作引數佔位符 固定引數和可選引數共同構成可變引數函式的引數列表...