免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2629 | 回复: 2
打印 上一主题 下一主题

C语言可变参数表中的宏 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-17 18:51 |只看该作者 |倒序浏览
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 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-02-17 20:16 |只看该作者
1、_INTSIZEOF(t)的作用是按int长度做字节对齐;为了内存管理方便,计算机内部数据结构实际占用的大小和数据结构的大小并不一定相同,根据体系结构或者编译器的不同,有4,8,16等多种对齐方式。
2、(   *(t   *)((ap   +=   _INTSIZEOF(t))   -   _INTSIZEOF(t))   )
这个表达式有几个作用:
a、参数链表指针移到下一个参数位置;
b、取得当前参数的指针;
c、把指针按t类型强制转换,并取得它的右值。

[ 本帖最后由 gaintdot 于 2009-2-17 20:26 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2009-02-18 09:20 |只看该作者
谢谢,我明白了
原来其中的ap已经改变,已经到下一个参数,而这个表达式的结果是当前参数的值
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP