C 引數個數可變函式的本質

2021-07-30 16:44:40 字數 784 閱讀 1074

va_list是乙個巨集,由va_start和va_end界定。

typedef char* va_list;

void va_start ( va_list ap, prev_param );

type va_arg ( va_list ap, type );

void va_end ( va_list ap );

其中,va_list 是乙個字元指標,可以理解為指向當前引數的乙個指標,取參必須通過這個指標進行。

在呼叫參數列之前,應該定義乙個 va_list 型別的變數,以供後用(假設這個 va_list 型別變數被定義為ap);

然後對 ap 進行初始化,讓它指向可變參數列裡面的第乙個引數。這是通過 va_start 來實現的,其第乙個引數是 ap 本身,第二個引數是在變參表前面緊挨著的乙個變數;

然後是獲取引數,呼叫 va_arg。它的第乙個引數是 ap,第二個引數是要獲取的引數的指定型別,並返回這個指定型別的值,同時把 ap 的位置指向變參表的下乙個變數位置;

獲取所有的引數之後,我們有必要將這個 ap 指標關掉,以免發生危險,方法是呼叫 va_end。它是將輸入的引數 ap 置為 null,應該養成獲取完參數列之後關閉指標的習慣。

例子:int max(int n, ...) 

// 定參 n 表示後面變參數量,定界用,輸入時切勿搞錯

va_end(ap); 

// 善後工作,關閉 ap

return maximum;

}// 在主函式中測試 max 函式的行為(c++ 格式)

int main()

引數個數可變的函式

今天突然想起引數個數可變的函式,然後想了下,覺得自己還真不太了解它,遂決定弄清楚。1.如何取得可變引數 比如 void f int fixpara1,char p char fixpara1 取得固定引數位址 cout int p 為什麼p 4可以取到第乙個可變引數呢?因為引數在函式被呼叫前,會逐個...

可變引數個數的函式

type vafunction type arg1,type arg2,引數可以分為兩部分 個數確定的固定引數和個數可變的可選引數。函式至少需要乙個固定引數,固定引數的宣告和普通函式一樣 可選引數由於個數不確定,宣告時用 表示。固定引數和可選引數公同構成乙個函式的引數列表。標準c c 包含標頭檔案s...

swift定義引數個數可變的函式

在oc中,當乙個功能豐富的類對外暴露介面時,在.件中往往會提供一系列的api,引數由少到多。但是在.m檔案的實現中,往往都是利用乙個通用的實現。例如 宣告 int addnuma int numa numb int numb int addnuma int numa numb int numb nu...