c 可变参数的陷阱

对于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个参数不能被指定为charshort或者float类型**。
因为charshort类型的参数会被转换为int类型,而float类型的参数会被转换为double类型 ……
例如,这样写肯定是不对的:
c = va_arg(ap,char);
因为我们无法传递一个char类型参数,如果传递了,它将会被自动转化为int类型。上面的式子应该写成:
c = va_arg(ap,int);

答案是在这里找到的:
https://blog.csdn.net/smstong/article/details/50751121

猜你喜欢

转载自blog.csdn.net/bin_zhang1/article/details/80929391
今日推荐