利用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
int
、signed
short
int
、unsigned
short
int
——float
一个简单的理由是:
——调用者绝对不
会
向my_printf
传递
以上类型的实际参数
。
在C语言中,调用一个不带原型声明的函数时:
调用者会对每个
参数执行“默认实际参数提升
(default argument promotions
)”。
同时,对可变长参数列表超出最后一个
有类型声明的形式参数
之后的每一个实际参数
,也将执行上述提升工作。
提升工作如下:
——float类型的实际参数将提升到double
——char、short和相应的signed、unsigned类型的实际参数提升到int
——如果int不能存储原值,则提升到unsigned int
然后,调用者将提升后
的参数传递
给被调用者。
所以,my_printf是绝对无法接收到
上述类型的实际参数的。
本文探讨了在C语言中使用可变参数列表时需要注意的问题,特别是关于va_arg宏的使用限制,解释了为何不能直接获取如char、short、float等特定类型的参数,并介绍了默认实际参数提升的概念。

被折叠的 条评论
为什么被折叠?



