对于c可变参数,为了良好的移植性我建议使用c标准库 stdarg.h
因为对于有些编译器来说,函数参数是用栈连续存储的,这样的话我们使用指针遍历即可,但是有些编译器不是这样的,所以建议使用标准库,但是标准库的使用也有很多坑,这里给我我曾经犯过的错误
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
void func(int n, ...)
{
va_list iter;
va_start(iter,n);
printf("%d\n",va_arg(iter,int) );
printf("%f\n",va_arg(iter,double) );//之前我使用va_arg(iter,float)
printf("%s\n",va_arg(iter,char *) );//之前我使用va_arg(iter,char)
va_end(iter);
}
int main()
{
func(3,1,2.5,"lili");
return 0;
}
但是为什么不能像我之前那样使用那?于是开始到网上找答案,最终找到
**va_arg宏的第2个参数不能被指定为char、short或者float类型**。
因为char和short类型的参数会被转换为int类型,而float类型的参数会被转换为double类型 ……
例如,这样写肯定是不对的:
c = va_arg(ap,char);
因为我们无法传递一个char类型参数,如果传递了,它将会被自动转化为int类型。上面的式子应该写成:
c = va_arg(ap,int);
答案是在这里找到的:
https://blog.csdn.net/smstong/article/details/50751121