关于不定参数的函数的问题!

spirix 2003-05-29 05:06:08
不定参数的函数的参数处理是建立在栈上的,

printf(const char* msg,...);
函数内部处理时候要用到如下的宏


#define _INTSIZEOF(n)
( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )

#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
#define va_end(ap) ( ap = (va_list)0 )

我一直搞不懂为什么要用 _INTSIZEOF 代替 sizeof,

#define _INTSIZEOF(n)
( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
又代表什么呢?
...全文
32 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
spirix 2003-05-29
  • 打赏
  • 举报
回复
楼上的太聪明了,完全是这样,我想清楚了!
#define _INTSIZEOF(n)
( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
定义成这样是为了对齐,因为,系统压栈的字长和机器的物理字长一致,比如8086压栈一次2字节,80386后,都是32位机,压栈一次4字节
并且,因为int型的大小是跟机器的物理字长是对应的
比如,如果是在8080上,那么_INTSIZEOF(n)将是两个字节对齐的!


欢迎继续讨论!
idontlikenickname 2003-05-29
  • 打赏
  • 举报
回复
应该是计算第一个变参数在栈中的偏移用的吧.

rtdb 2003-05-29
  • 打赏
  • 举报
回复
做了个测试, 那个宏的作用是将sizeof(n)归整为sizeof(int)的整数倍。
1-》4
3-》4
4-》4
5-》8
7-》8
10-》12
那应是个整形栈, 进出栈都是四字节对齐的。

69,382

社区成员

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

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