- 论坛徽章:
- 0
|
小弟初次研究可变参数的问题,下午在看其中的几个宏定义。
有些疑惑,望各位大侠指教。
系统中宏定义如下:
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的定义,定义为&v+_INTSIZEOF(v),而&v是固定参数在堆栈的
地址,所以我们运行va_start(ap, v)以后,ap指向第一个可变参数在堆
栈的地址
首先ap+=sizeof(int),已经指向下一个参数的地址了.然后返回
ap-sizeof(int)的int*指针,这正是第一个可变参数在堆栈里的地址
(图2).然后用*取得这个地址的内容(参数值)
这样我有一个很疑惑的地方,在定义宏va_start(ap,v)的时候,ap已经指向了第一个可变参数的地址,为什么还要先加 _INTSIZEOF(t),然后再减去 _INTSIZEOF(t)这样的操作,用来获得第一个可变参数的地址呢?
不是多此一举吗?
不过既然这样做了,一定有可取的地方。望各位大侠指教小弟!!!!! |
|