- 论坛徽章:
- 2
|
没说,不代表就可以这样做呀 ……
不能这样做的理由是, 在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 编辑 ] |
|