关于可变参数函数的标准宏定义va_arg,请教

jjaing 2007-11-27 03:25:32
#define __va_rounded_size(TYPE) \
(((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int))

#define va_arg(AP, TYPE) \
(AP += __va_rounded_size (TYPE), \
*((TYPE *) (AP - __va_rounded_size (TYPE))))

以上二个宏定义取自标准库文件,执行语句
int i;
i = va_arg(args, int);

预处理后的结果是:
i = (args += (((sizeof (int) + sizeof (int) - 1) / sizeof (int)) * sizeof (int)), *((int *) (args - (((sizeof (int) + sizeof (int) - 1) / sizeof (int)) * sizeof (int))))) ;


请教这个语句是如何执行的,实现了地址的增加和取地址指向的值,但是当中为何用逗号隔开的?
...全文
107 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
jjaing 2007-11-27
  • 打赏
  • 举报
回复
多谢 五岭散人
ouyh12345 2007-11-27
  • 打赏
  • 举报
回复
逗号表达式:从左到右执行语句,结果为最右边的
即先执行(args += (((sizeof (int) + sizeof (int) - 1) / sizeof (int)) * sizeof (int)),注意args有移动,再执行
*((int *) (args - (((sizeof (int) + sizeof (int) - 1) / sizeof (int)) * sizeof (int)))))

69,369

社区成员

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

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