可變引數列表

2021-09-30 08:40:34 字數 728 閱讀 6456

c語言中可變引數列表是通過巨集來實現的,這些巨集包含在stdarg.h標頭檔案中,該標頭檔案定義了va_list型別和三個巨集:va_start、va_arg、va_end。用法:首先宣告乙個va_list型別的變數,使用va_start巨集進行初始化,va_start巨集的第乙個引數是該va_list型別的變數,第二個引數是非可變引數的最後乙個引數,在訪問可變引數時使用va_arg巨集,該巨集的第乙個引數是va_list變數名第二個引數是引數列表中下乙個引數的型別。va_arg巨集返回該引數的值,並使變數指向下乙個可變引數。當訪問完最後乙個引數之後,需要呼叫va_end巨集。例:

從這個例子可以知道,可變引數是有限制的:

1、可變引數必須從頭到尾逐個順序的訪問,可以訪問幾個變數後終止,但是不可以從一開始就訪問中間的變數。

2、引數列表中至少要有乙個命名引數,因為要使用va_start巨集進行初始化。

3、這些巨集無法判斷實際存在引數的數量。

4、這些巨集無法判斷每個引數的型別。

在c語言中使用可變引數列表最好的乙個例子就是printf函式,該函式的命名引數就是格式化字串,同時在格式化字串中提供了後面可變引數的型別。

在使用可變引數列表需要注意的是如果在va_arg巨集指定了錯誤的型別,其結果是不可預知,因為資料的本質都是二進位製碼,指定不同的型別只是訪問時系統以不同的指令進行訪問。並且char、short和float型別的值實際上將作為int或double型別的值傳遞給函式,因為va_arg巨集無法準確識別作用於可變引數之上的預設引數型別提公升。

可變引數列表

模擬實現printf函式 va list是在c語言中解決變參問題的一組巨集,所在標頭檔案 include 用於獲取不確定個數的引數 va start,函式名稱,讀取可變引數的過程其實就是在堆疊中,使用指標,遍歷堆疊段中的引數列表,從低位址到高位址乙個乙個地把引數內容讀出來的過程 va arg,這個巨...

可變引數列表

小二,上 class a public class varargs two param static void twostringparam string a,string b three param 參照上兩種寫法,一直往後面加。是不是感覺很憂傷 幸好這不是真的。string.a static v...

可變引數列表

測試環境 vs2008 1 可變引數列表 為什麼需要可變引數呢?在函式原型中,列出了函式期望接受的引數,原型只能顯示固定數目的引數,如果函式原型列出的引數與可呼叫引數不匹配或數目不一樣,程式將無法執行。例如,我們想要求一系列值的平均值,這裡的一系列的數目是不確定的,如果這些值儲存於陣列中,這個任務就...