读书人

va_arg的一个有关问题求解释

发布时间: 2013-06-26 14:29:32 作者: rapoo

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.

又是隐式转换惹的祸
[解决办法]
楼上正解。。

读书人网 >C语言

热点推荐