c语言list函数参数,C语言可变参数函数详解 va_list va_arg va_start宏

可变参数函数:需要包含的头文件

参数数目是可变的。比如 C 语言的 printf 系列的(格式化输入输出等)函数,都是参数可变的,形式是形参是三个点。 如printf 函数的声明:

int printf ( const char * format, ... )

不过并不是所有的都应该如此,也可以像这样:void show(int x,int y, ...);根据形式可知则至少需要两个参数。那能不能这样 void show(...),不能,因为我们需要根据第一个参数获取整个参数列表的地址。具体下面详解。

一般我们用可变参数都是这种形式,下面就用这个形式的举例子 void show(const char* data,...)

可变参数函数的几个宏:va_list va_start va_end va_arg

那怎么得到并使用多个参数呢

0818b9ca8b590ca3270a3433284dd417.png

首先,你需要在函数中定义一个va_list变量p,在此理解为一个指针。但是这指针现在还没有指向东西(野指针)。

怎么让他指向我们的参数列表:用va_start(p,data),data是我们函数的第一个参数,调用这个宏之后,p指向了参数列表中data后的位置,获取参数列表完成。

想获取某个参数该如何,va_arg(p,类型);比如想获取一个整形参数,可以这样a=va_arg(p,int); 之前想怎么知道有多少个参数,并没有直接获取有多少个参数的宏。

最后调用下:va_end(p)就行了。

OK,到此可变参数的基本用法已经讲完。

项目中用到可变参数的不多,大多数是生成日志,报错之类的。根据可变参数函数,生成日志文件,一般用vfprintf,方法如下。当然这个时候第一个参数必须是参数格式字符串"%s %d "的,后面跟实际参数。写入文件流。

void LogMsg(char *strMsg, ...) {   va_list  aplist;   FILE     *fp;     va_start(aplist, strMsg);     fp = fopen("my.log", "a");     if (fp != NULL)      {       vfprintf(fp, strMsg, aplist);       fclose(fp);     }     va_end(aplist); }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值