免费注册 查看新帖 |

Chinaunix

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

[C] 为什么是(char)va_arg(ap, int)? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-08 21:31 |只看该作者 |倒序浏览
对于type va_arg(va_list ap, type);
我看标准草案n1362.pdf上并没说type不能为char型,
可为什么都是写成(char)va_arg(ap, int),而不是是va_arg(ap, char)?

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
2 [报告]
发表于 2009-04-09 07:59 |只看该作者
没说,不代表就可以这样做呀 ……

不能这样做的理由是, 在C语言中,
如果一个函数f, 它的某个形式参数p没有声明参数类型
那么调用函数f时, p对应的实际参数a的类型如果是如下一些类型:
char、signed char、unsigned char、signed short、unsigned short、float
那么将对实际参数执行提升:
char、short -> int (如果int不能表达实际参数的值, 将提升到unsigned int)
float -> double

也就是说, 如果p没有被声明类型, 调用者根本不可能为其传递 char、 short或者float类型的实际参数。


显然, 可变长参数列表中省略号代表的部分,是没有声明形式参数类型的。
在调用时, 为省略号部分传递的实际参数, 都将执行上述的提升。
所以, va_arg(ap, type) type不能是 (signed|unsigned)? char、(signed|unsigned) short、 float中任意一种类型。 因为根本就不可能传递这些类型的实际参数。


C++对可变长参数列表中的省略号部分, 在调用时也会做相同处理。




参考资料:

事情很清楚,如果一个参数没有声明,编译器就没有信息去对它执行标准的类型检查和转换。在这种情况下,一个char或short将作为int传递,float将作为double传递。这些做未必是程序员所期望的。
脚注:这些都是由C语言继承来的标准提升。对于由省略号表示的参数,其实际参数在传递之前总执行这些提升(如果它们属于需要提升的类型),将提升后的值传递给有关的函数。——译者注

TC++PL 7.6 p138

在没有函数原型的情况下,char与short类型都将被转换为int类型,float类型将被转换为double类型。

TCPL 2.7类型转换 p36



我也想在标准中找到对应的描述 ……  没找到。。。
不过这2本书应该足够权威了吧

[ 本帖最后由 OwnWaterloo 于 2009-4-9 08:06 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP