与可变参数实现相关的几个宏

头文件:stdarg.h

#define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )
//将sizeof()转换位相应int类型对应的字节数,&~先当与除法,(+sizeof(int)-1)是为了补字节,除(sizeof(int)-1)是为了防止全置0;例:n为char,1+4-1=4(&~)4-1=3->4否则4&~4=0
#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) ) 
//计算第一个可变参数地址,v为省略号前一个变量名(地址)
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
//计算下一个变量地址,ap已经指向下一个可变参地址,但宏返回当前可变参地址
#define va_end(ap) ( ap = (va_list)0 )
// 将ap置空
posted @ 2012-08-18 14:59  ArthurSJiang  阅读(127)  评论(0编辑  收藏  举报