- 论坛徽章:
- 0
|
http://linux.chinaunix.net/bbs/v ... =1058562#pid6880212
这是一个C语言中对于实现可变参数功能的几个宏的解释,
其中
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
/*这个宏做了两个事情,
①用用户输入的类型名对参数地址进行强制类型转换,得到用户所需要的值
②计算出本参数的实际大小,将指针调到本参数的结尾,也就是下一个参数的首地址,以便后续处理。*/
这段话 我没有看明白,不明白对于ap的操作,获取了ap+偏移量的值后,用这个再减去偏移量,能回到以前的地址么?
对于这个宏还有另外一个实现:
#define va_arg(list, mode) ((mode *)(list = (char *) ((((int)list + (__builtin_alignof(mode)<=4?3:7)) &\
(__builtin_alignof(mode)<=4?-4:- 8 ))+sizeof(mode))))[-1]
[ 本帖最后由 sunnirvana 于 2009-2-17 18:53 编辑 ] |
|