va_arg的一个问题,求解释
[解决办法]
变参函数调用时,float会提升至double。
所以不要在va_arg中使用float类型
[解决办法]
这个问题问的很经典,非常有代表性,印象中《C陷阱与缺陷》里面有涉及到。
简单的说,用va_arg(ap,type)取出一个参数的时候,
type绝对不能为以下类型:
char、signed char、unsigned char
short、unsigned short
signed short、short int、signed short int、unsigned short int
float
原因是会对每个参数执行“默认实际参数提升(default argument promotions)”机制,
char、short和相应的signed、unsigned类型的实际参数提升到int
如果int不能存储原值,则提升到unsigned int
float类型的实际参数将提升到double
------解决方案--------------------
va_arg 宏的第二个参数不能是 char, short, 它们会被提升为 int, flaot 被提升为double.
又是隐式转换惹的祸
[解决办法]
楼上正解。。