免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: thinhare
打印 上一主题 下一主题

高手请进:难道标准库STDARG.H是错的? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2005-09-23 21:37 |只看该作者

高手请进:难道标准库STDARG.H是错的?

咦,这段代码应该不会有“怎么知道第一个参数有多长”的问题吧,
好像是直接把第一个参数的类型传给va_arg,然后va_arg直接
把ap在栈里面移动这么多地方就行了,感觉就是代码里面写死了的,
也没用到什么灵活判断吧,至少表面上看是这样的,

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
12 [报告]
发表于 2005-09-23 21:54 |只看该作者

高手请进:难道标准库STDARG.H是错的?

现在的年轻人可真是富有怀疑精神啊!
不服老不行啊!

论坛徽章:
0
13 [报告]
发表于 2005-09-23 22:17 |只看该作者

高手请进:难道标准库STDARG.H是错的?

flw, 你先别忙着卖老,先帮我把问题解答一下行不?

论坛徽章:
0
14 [报告]
发表于 2005-09-23 22:45 |只看该作者

高手请进:难道标准库STDARG.H是错的?

参数入栈是4字节对齐的,你给它一个 `a', 也要占用 4 个字节。至少在 x86 上是如此。


  1. #define _INTSIZEOF(n)   ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
复制代码


这个宏计算对象 n 所占用的 4 字节大小。 n 是根据 %* 得到的,比如 %c,则 n 为 char

stdarg 依靠这个宏计算偏移值。

字符串或数组作为参数时只是地址, 本身的长度并不能从参数列表中体现出来, stdarg 无需计算它。

论坛徽章:
0
15 [报告]
发表于 2005-09-24 01:00 |只看该作者

高手请进:难道标准库STDARG.H是错的?

win_hate,你说到点子上了,其实就是variable-length argument的处理中的一个细节,可能我表达得也不是很清楚,所以其他人没有理解我的意思。
不过你为什么要hate win呀?最多也就是dislike就可以了,hate好像说不通。说句闲话,别见怪。

论坛徽章:
0
16 [报告]
发表于 2005-09-24 09:04 |只看该作者

高手请进:难道标准库STDARG.H是错的?

我承认 win_hate 名字起得太糟糕,本来没准备长用的。

现在写程序的时候就经常琢磨,哇,这个变量该叫什么好呢? 命名,是一件很重要的事情。
zhu163 该用户已被删除
17 [报告]
发表于 2006-04-04 20:17 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
zhu163 该用户已被删除
18 [报告]
发表于 2006-04-04 20:21 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
19 [报告]
发表于 2006-04-04 23:01 |只看该作者
反汇编一下不是就明白了?

论坛徽章:
0
20 [报告]
发表于 2006-04-05 00:58 |只看该作者
第一次见到这么多神仙,拜一个……

其实我们首先应该怀疑的是,va_start 的本质。如果 va_start 是一个宏,那么 sizeof() 得到的和调用处进行 sizeof 得到的不会有区别。
其次,va_start 只关注参数本身,不关注参数作为一个指针实际指向的是什么。printf 的第一个参数是 char *fmt,紧跟其后的就是一个与 fmt 中对应的类型的参数(如 "%s" 后紧跟的应该是一个 char *)。换言之,va_* 不关心 fmt 指向的东西有多大,不关心 *arg 有多大,只关心 fmt 本身。

btw,本来想看看 va_start 的实现,结果发现 gcc 3.3 中 va_start 居然是 __builtin_*,吐血。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP