VA_ARG宏的实现

来源:互联网 发布:linux mint 17 输入法 编辑:程序博客网 时间:2024/06/05 17:36

_ARG宏VA_ARG宏_ARG宏的实现

 

#define va_arg(ap,t)    (*(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )

这个宏做了两个事情,

①用用户输入的类型名对参数地址进行强制类型转换,得到用户所需要的值

     ②计算出本参数的实际大小,将指针调到本参数的结尾,也就是下一个参数的首地址,以便后续处理。

VA_ARG宏

  获取可变参数的当前参数,返回指定类型并将指针指向下一参数(t参数描述了当前参数的类型):

  #define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) -_INTSIZEOF(t)) )

 

 

(  *(t *) ( (ap += __INTSIZEOF(t)) - __INTSIZEOF(t)) )

              

①   该处表达式等于ap=ap+_INTSIZEOF(t) 即ap指向了下一个可变参数的首地址,ap的值发生了改变;

②    第二步做  [ ap=ap+_INTSIZEOF(t)]-_INTSIZEOF(t) 这样 ap的值虽然发生了改变,但这个表达式的值还是ap原来的地址值

③    第三步 (t *)先进行强制类型转换转换为 类型的指针之后,再做*(t*)即将地址强制类型转换为 类型后,再取该地址中的内容;

④    经过这三步 VA_ARG宏 便实现了 

a.获取可变参数的当前参数

 b. 返回指定类型并将指针指向下一参数

总结:从上述过程可知VA_ARG宏 是先将ap指向下一个参数后,再获取当前参数