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

mage1982 2007-01-20 12:45:21
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )

按C标准的意思,是说将将指针调到本参数的结尾,也就是下一个参数的首地址。
我实在不明白,_INTSIZEOF(t)将对应类型t对齐后先加到va_list里,又减了出去,到底进行了怎样的操作????

钱不多但是全部了!!!谢谢了!!!
...全文
791 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
晨星 2007-01-21
  • 打赏
  • 举报
回复
呵呵,或许在他们看来,那样也没有不明了。
库里的东西嘛。只要他们自已读起来没有障碍就行了。
pluton 2007-01-21
  • 打赏
  • 举报
回复
-_-
mage1982 2007-01-21
  • 打赏
  • 举报
回复
那为什么不写成:

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

这样多明了啊!!!
a_b_c_abc11 2007-01-20
  • 打赏
  • 举报
回复
先辈的技巧. 你取一次值,指针就自动变一次.如果分成两步就好懂了.
晨星 2007-01-20
  • 打赏
  • 举报
回复
加了,没减回去。
注意,是:
(ap += _INTSIZEOF(t)) - _INTSIZEOF(t)
而不是:
(ap + _INTSIZEOF(t)) - _INTSIZEOF(t)

这两者当然不一样了。
主要是ap变了,下一次再取下一个参数时,就不会仍然取到先前的那个了,这就够了。
pluton 2007-01-20
  • 打赏
  • 举报
回复 1
举个例子说明吧
int y=va_arg(x,int);
宏展开成( *(int *)((x += _INTSIZEOF(int)) - _INTSIZEOF(int)) )
此时x指向下一个参数(x = x + _INTSIZEOF(int))
然后x再减去_INTSIZEOF(int)得到x未改变前的地址,
再将x所指向的int类型的值赋给y

也就就是说y取得x所指向的int类型的值,然后x指向下一个参数地址

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧