★函式:
使用va_list巨集組解決變參問題
1、首先定義va_list型的變數,這個變數是指向引數的指標。
2、然後用va_start巨集初始化剛定義的va_list變數,這個巨集的第二個引數是「第乙個可變引數的前乙個引數」。
3、再用va_arg得到可變引數,第二個引數是「可變引數」的型別。
4、最後用va_end巨集結束可變引數的獲取。
如果有多個可變引數,依次呼叫va_list獲取各個引數。
使用va_list應該注意的問題:
1、可變引數函式,必須通過某種方式事先預知傳入引數的型別。可變引數函式的呼叫者,必須按照該方式傳入對應型別的引數。一旦引數型別不匹配,將可能導致返回錯誤或無意義的資料,甚至棧被破壞。
2、編譯器對可變引數的函式的原型檢查不夠嚴格,不利於寫出高質量**。在非必要情況下,應當盡量採用c++過載、多型等方式實現函式,而盡量不要使用可變引數。
★巨集
巨集也可以帶可變引數,如:
#define
print( format, ... ) printf( format,
##__va_args__
); 「##」不可以省略,如果省略,就不可以省略可變引數部分。比如:「pintf("hello");」,無可變引數部分,解釋print巨集時就會多出乙個「,」號,導致編譯出錯。
或者可以這樣定義:
#define
print( format, args... ) printf( format,
##agrs );
C C 可變引數
函式 使用va list巨集組解決變參問題 1 首先定義va list型的變數,這個變數是指向引數的指標。2 然後用va start巨集初始化剛定義的va list變數,這個巨集的第二個引數是 第乙個可變引數的前乙個引數 3 再用va arg得到可變引數,第二個引數是 可變引數 的型別。4 最後用v...
C C 可變引數
為了解決這些問題,我們首先要解釋cdecl呼叫約定 參見論調用約定 所有使用不定引數的函式必須是使用cdecl 全域性函式 或者this call 類成員函式 呼叫約定。該約定對於引數傳遞規定如下 引數從右向左入棧 也就是如果你呼叫f a,b,c 則c先入棧,然後是b,最後是a入棧 呼叫者負責清理堆...
c c 可變引數
c語言支援在函式定義時,用 省略號代表可變引數列表,中最常見的可變引數的例子是printf引數,c 的可變引數繼承自c。可變引數的引數列表在壓棧時,同一組引數是按照從右向左的順序,逐個由高位址向低位址壓倒棧中。知道到最左邊乙個引數的位址 型別和右邊每個引數的型別,就可以計算出每乙個引數的位址,這是可...