發現一個陌生的議題 - variable argument
主要有以下幾個macro要搞懂
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_arg(ap,t) (*(t*)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)))
#define va_end(ap) (ap = (va_list)0)
va_start主要是算出不定參數的起始位置並設給 ap
之後 va_arg再利用 ap的值一一取得這些不定參數
最後 va_end將 ap歸零
#define va_start(ap,v) (ap = (va_list)&v + _INTSIZEOF(v))
這裡的 v 是函數固定參數的最後一個
以最後一個固定參數的位置再加上這個參數的大小
就可以得到下一個參數的位置
而下一個參數就是不定參數群的第一個
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
這裡的 t 是不定參數的型態
每次取完一個不定參數後
就將 ap 的位置設往下一個不定參數的起始位置
#define va_end(ap) ( ap = (va_list)0 )
這個就是簡單的歸零動作而已
在char*的型態中,0就是NULL
[Reference]
http://ehome.hifly.to/showthread.php?threadid=329
沒有留言:
張貼留言