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

    技术2026-01-15  9

    利用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是绝对无法接收到 上述类型的实际参数的。

    最新回复(0)