#include
c++對於函式支援可變形參,它通過「...」來表示未知個數的形參,通過va_**系列函式進行操作。
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()
對於上例可以通過指標實現,int *pint=# pint++,則指向下乙個引數。更常用的(更明智的)做法是通過va_arg()的返回值來判斷,把最後的引數設定為某個值,當獲取的值與該值相等時說明已經沒有引數了。因此我們就沒有必要指定引數的個數了。
C 可變引數
寫 之前要先介紹一下可變引數的備用知識 c函式要在程式中用到以下這些巨集 void va start va list arg ptr,prev param type va arg va list arg ptr,type void va end va list arg ptr va在這裡是varia...
C 可變引數
1.概念 常用如printf函式 它的引數並不是固定個數的,而在呼叫時根據情況確定 2.c中的實現 用到了 va list 每次指向乙個可變的引數 va start 初始化va list變數,使其指向第乙個可變引數 va end 清理 3.書上的兩個簡單例子 1 int print arg int ...
C可變引數 printf(巨集處理可變引數)
x86平台下的巨集定義 typedef char va list 記憶體對齊 與sizeof int 對齊 0 sizeof n 4,intsizeof n 4 4 sizeof n 8,intsizeof n 8 define intsizeof n sizeof n sizeof int 1 s...