可变参数函数:需要包含的头文件
参数数目是可变的。比如 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
那怎么得到并使用多个参数呢
首先,你需要在函数中定义一个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); }