C和指针之实现可变参数函数编译出现expanded from macro 'va_arg' #define va_arg(ap, type) 解决办法

1、问题

编译可变参数函数里面有va_arg函数的时候提示这个错误
expanded from macro 'va_arg'  #define va_arg(ap, type) 



2、原因

我没有考虑“默认参数提升”问题
如果一个函数的形参类型未知, 例如使用了Old Style C风格的函数声明,或者函数的参数列表中有 ...,那么调用函数时要对相应的实参做Integer Promotion,此外,相应的实参如果是float型的也要被提升为double类型, char 要提升为int类型,这条规则称为Default Argument Promotion。
我的代码是这样写的
va_arg(arg, float)



3、如何修改代码

va_arg(arg, double)



4、总结

默认实际参数提升场景:
一般是可变参数列表,第一个参数有类型,后面的可变参数没类型,后面所有的可变参数就会有 默认参数提升的场景

va_arg(ap,type)取出一个参数的时候,
type绝对不能为以下类型:
char、signed char、unsigned char
short、unsigned short
signed short、short int、signed short int、unsigned short int
float

float类型的实际参数将提升到double
char、short和相应的signed、unsigned类型的实际参数提升到int
如果int不能存储原值,则提升到unsigned int

















你可能感兴趣的:(C和指针)