可变参数列表需要注意的问题

利用va_arg, va_end, va_start这几个宏可以实现在函数中输入可变参数。例如printf,sprintf等函数。

今天自己写一个可变参数列表的时候,发现几个要注意的问题。

 

摘抄如下:

详细看这里:http://www.cppblog.com/ownwaterloo/archive/2009/04/21/unacceptable_type_in_va_arg.html


简单的说,我们用va_arg (ap ,type )取出一个参数的时候,
type 对不能为 以下类型:
——char signed char unsigned char
——short unsigned short
——signed short short intsigned short intunsigned short int
——float


一个简单的理由是:
——调用者绝对不my_printf 传递 以上类型的实际参数


在C语言中,调用一个不带原型声明的函数时:
调用者会对每个 参数执行“默认实际参数提升 (default argument promotions )”。

同时,对可变长参数列表超出最后一个类型声明的形式参数 之后的每一个实际参数 ,也将执行上述提升工作。
提升工作如下:
——float类型的实际参数将提升到double
——char、short和相应的signed、unsigned类型的实际参数提升到int
——如果int不能存储原值,则提升到unsigned int

然后,调用者将提升后 的参数传递 给被调用者。
所以,my_printf是绝对无法接收到 上述类型的实际参数的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值