變參函式定義形式如func(type a, …),要求至少乙個固定引數,因為需要通過這個引數來確定究竟有多少個引數、以及引數的型別。
windows中,變參函式用來獲取引數的幾個巨集定義如下。
typedef char * va_list;
#define _addressof(v) (&(v))
#define _intsizeof(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int)-1))
#define va_start(ap,v) (ap=(va_list)_addressof(v)+_intsizeof(v))
#define va_arg(ap,t) (*(t*)((ap+=_intsizeof(t))-_intsizeof(t)))
#define va_end(ap) (ap=(va_list)0)
_addressof的作用是獲取資料的位址,_intsizeof是獲取指定型別資料按照int型別對齊的空間大小,va_start就是根據第乙個引數來獲取第二個引數,va_arg是根據當前引數獲取第二個引數。通過這種方法能獲取到引數的原因是引數是從右到左依次壓入棧的,並且棧是從高位址向低位址生長的,這兩個條件決定了可以使用這種方法獲取引數。
如上圖所示,當呼叫func(a, b, c, d, e, f, g, h)時,引數會從高位址向低位址壓入引數,引數是從右向左的順序壓棧的,第乙個引數的位址加上第乙個引數的大小便得到了第二個引數的位址,以此類推便可以得到各個引數的位址。
變參函式設計
變參函式的應用得比較少.輸出log資訊功能的函式演常會用到變參函式.什麼是變參函式?比如 printf 個數 d,總數 d a,b printf就是變參函式,因為其引數的個數不是固定的.變參函式一般用到下列巨集 va arg retrieve argument from list va end re...
變參函式詳解
在呼叫函式時,如果我們希望函式的引數個數是可變的,那麼便需要用到變參函式,既在每次函式呼叫時輸入的引數個數不定。我們需要知道以下兩點 1 函式形參入棧方向為自右向左 2 在乙個程序的記憶體空間中,棧低為高位址,棧頂為低位址。所以我們可以從最後乙個入棧的引數 形參第乙個 根據位址以及棧空間的特點依次找...
變參函式實現細節
c語言的函式雖然不具備c 的多型性,但也可以接受引數不確定的情況,當然,c語言中的變參函式實際在功能上是受限的,廢話不多講,下面來看看變參函式的邊邊角角的問題。討論之前我們來看一下最熟悉的變參函式printf的原型宣告 int printf const char format,注意到,在函式中宣告其...