可變引數列表

2022-09-15 16:06:09 字數 734 閱讀 6104

考慮乙個計算一系列值的平均值的函式:

float

**erage

(int n_values,

int v1,

int v2,

int v3,

int v4,

int v5)

上面這個函式存在幾個問題:

它不對引數的數量進行測試,無法檢測到引數過多這種情況。

函式無法處理超過5個的值

接下來介紹stdarg巨集來解決這個問題:

可變引數列表是通過巨集來實現的,這些巨集定義於stdarg.h標頭檔案,它是標準庫的一部分。這個標頭檔案宣告了乙個型別va_list和三個巨集——va_start、va_arg、va_end。

#include

float

**erage

(int n_values,..

.)

注意引數列表中的省略號:它提示此處可能傳遞數量和型別未確定的引數。在編寫這個函式的原型時,也要使用相同的記法。

函式宣告了乙個型別為va_list、名叫var_arg的變數,它用於訪問引數列表的未確定部分。

var_arg變數通過呼叫ca_start來初始化。其第1個引數是va_list變數的名字,第2個引數是省略號前最後乙個有名字的引數。初始化過程把var_arg變數設定為指向可變引數部分的第1個引數。

當訪問完畢最後乙個可變引數之後,我們需要呼叫va_end。

可變引數列表

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