C C 可變引數

2021-06-07 06:23:14 字數 1317 閱讀 9836

★函式:

使用va_list巨集組解決變參問題

1、首先定義va_list型的變數,這個變數是指向引數的指標。

2、然後用va_start巨集初始化剛定義的va_list變數,這個巨集的第二個引數是「第乙個可變引數的前乙個引數」

3、再用va_arg得到可變引數,第二個引數是「可變引數」的型別

4、最後用va_end巨集結束可變引數的獲取。

如果有多個可變引數,依次呼叫va_list獲取各個引數

[cpp:nogutter]view plain

copy

dword

chxvmsystem::runfuncition( 

dword

dwrunmode,           

// run mode.

lpctstr

lpszfunctionname,  

// function name

cval * pvalresult,         // return.

intntakeparamscount,      

// count of params

... )                      // params list

return

0;  

}  

使用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。可變引數的引數列表在壓棧時,同一組引數是按照從右向左的順序,逐個由高位址向低位址壓倒棧中。知道到最左邊乙個引數的位址 型別和右邊每個引數的型別,就可以計算出每乙個引數的位址,這是可...