提供了以下資料型別和巨集,以便我們編寫長度可變的函式
typedef char * va_list;
#define _intsizeof(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
#define va_start(ap,v) ( ap = (va_list)&v + _intsizeof(v) )
#define va_end(ap) ( ap = (va_list)0 )
#define va_arg(ap,t) ( *(t *)((ap += _intsizeof(t)) - _intsizeof(t)) )
實現可變引數的方法就是把函式的第乙個引數的值設為可變引數的個數,然後用以上幾個巨集把引數讀出來
使用方法:
假設有這麼乙個函式test(int num, ...);,且可變引數的型別都是int
那麼第一步是宣告乙個va_list變數ap,然後呼叫va_start(ap, num)使ap指向可變引數的第乙個引數。
第二步使用int value = va_arg(ap, int)讀出這乙個可變引數的值,同時ap也被指向了下乙個可變引數
重複第二步num次,最後使用va_end(ap)避免ap稱為野指標
其實認真的讀**,這幾個巨集真的不難理解
_insizeof(n)的功能是得到n的sizeof(int)向上取整的值
va_start(ap, v)的功能是是ap跳過v這個引數,從而指向第乙個引數,因為這考慮到對齊,v的型別佔的位元組數一定要是int型別的整數倍,所以需要向上取整
va_arg(ap ,t)就是讀取這個位置引數的值,並且將ap指向下乙個引數,下乙個引數的位置就是ap 加上t這個型別所佔的位元組數,這裡一樣要向sizeof(int)上取整
va_end(ap)就跟簡單了,就是把ap賦為0,防止我們訪問野指標
可變引數列印 解析可變引數
1.的一般用法 define str s s define cons a,b int a e b int main 2.接受,列印可變引數 參考 glibc庫的bebug函式 define printf fmt,args.printf fmt,args 使用方法 define pr debug fm...
可變引數列表解析
c語言中的可變引數是乙個比較有意思的實現,通過將函式實現為可變引數的形式,可以使得函式可以接受1個以上的任意多個引數 不固定 看乙個例子,求取幾個數裡面的最大值。主要 如下 int max int n,va end arg,int return max 關鍵問題是搞懂va list,va start...
可變引數列表解析
在c語言中 有些函式我們無法確定其需要傳遞的引數的個數 可以用省略號指定引數。它是利用函式傳參時的過程實現的,函式傳參過程是以棧的形式訪問的。關於函式棧幀 通過下面的 來演示 include include int add int n,n為後面引數的個數,為可選引數 int main 執行結果 在v...