有關VA LIST的用法

2021-04-15 00:14:02 字數 1010 閱讀 8404

va_list 是在c語言中解決變參問題的一組巨集

va_list的用法:

(1)首先在函式裡定義一具va_list型的變數,這個變數是指向引數的指標

(2)然後用va_start巨集初始化變數剛定義的va_list變數,這個巨集的第二個引數是第乙個可變引數的前乙個引數,是乙個固定的引數。

(3)然後用va_arg返回可變的引數,va_arg的第二個引數是你要返回的引數的型別。

(4)最後用va_end巨集結束可變引數的獲取。然後你就可以在函式裡使用第二個引數了。如果函式有多個可變引數的,依次呼叫va_arg獲取各個引數。

va_list在編譯器中的處理:

(1)在執行va_start(ap,v)以後,ap指向第乙個可變引數在堆疊的位址。

(2)va_arg()取得型別t的可變引數值,在這步操作中首先apt = sizeof(t型別),讓ap指向下乙個引數的位址。然後返回ap-sizeof(t型別)的t型別*指標,這正是第乙個可變引數在堆疊裡的位址。然後用*取得這個位址的內容。

(3)va_end(),x86平台定義為ap = ((char*)0),使ap不再指向堆疊,而是跟null一樣,有些直接定義為((void*)0),這樣編譯器不會為va_end產生**,例如gcc在linux的x86平台就是這樣定義的。

使用va_list應該注意的問題:

(1)因為va_start, va_arg, va_end等定義成巨集,所以它顯得很愚蠢,可變引數的型別和個數完全在該函式中由程式**控制,它並不能智慧型地識別不同引數的個數和型別. 也就是說,你想實現智慧型識別可變引數的話是要通過在自己的程式裡作判斷來實現的.

(2)另外有乙個問題,因為編譯器對可變引數的函式的原型檢查不夠嚴格,對程式設計查錯不利.不利於我們寫出高質量的**。

小結:可變引數的函式原理其實很簡單,而va系列是以巨集定義來定義的,實現跟堆疊相關。我們寫乙個可變函式的c函式時,有利也有弊,所以在不必要的 場合,我們無需用到可變引數,如果在c++裡,我們應該利用c++多型性來實現可變引數的功能,盡量避免用c語言的方式來實現。

va list 原理以及用法

va list 是在c語言中解決變參問題的一組巨集 他有這麼幾個成員 1 va list型變數 ifdef m alpha typedef struct va list else typedef char va list endif2 intsizeof 巨集,獲取型別占用的空間長度,最小占用長度為...

range有關的用法

range有關的用法 range 5 輸出結果為range 0,5 range 1,5 輸出結果為 1,2,3,4 其中range函式中的1為起始值,預設的步 長為1 步長可以為負數 range 1,5,2 輸出結果為 1,3 其中2為設定的步長 從1開始到5結束 不包括5 range 5,1,2 ...

有關泛型的用法

泛型 generic 是對clr型別系統的擴充套件,用於定義未指定某些細節的型別。實際上,本身就是泛型。使用泛型可以避免以下兩個常見的問題 冗餘和困擾開發人員的含混不清的編譯器錯誤。假設集合類sortedlist是object引用的集合,genericsortedlist是任意型別的集合,使用泛型具...