Q我有一个接受float参数。为什么
va_arg(argp, float)不起作用?
类型参数的可变参数函数在可变参数列表的可变长度部分,旧的“默认参数提升”规则仍然适用:类型为float的参数总是会被提升(拓宽)为double类型,而类型为char和short int被提升为int。因此,调用va_arg(argp, float)永远是错误的;你应该始终使用va_arg(argp, double)。类似地,使用va_arg(argp, int)来获取原本是char, short或int类型的参数。(出于类似的原因,传递给va_start的最后一个“固定”参数也不应是可被拓宽的类型。)另请参阅问题 11.3 和 15.2。
参考:ISO Sec. 6.3.2.2
Rationale Sec. 4.8.1.2
H&S Sec. 11.4 p. 297