2009年12月18日 星期五

C 的不定參數 variable argument

最近重看了一遍 K&R
發現一個陌生的議題 - 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

沒有留言:

張貼留言