在软件开发中,有时会遇到无法确定参数的输入个数,和输入类型的时候,这个时候就需要使用不定参数函数的相关概念了。在函数实现的时候,我们需要借助系统设定的几个宏:
va_list:定义A_LIST型的变量,这个变量是指向参数的指针ap;
va_start(ap,v),它的第一个参数是指向可变参数字符串的变量,第二个参数是可变参数函数的第一个参数,通常用于指定可变参数列表中参数的个数。注:这个宏和系统有关。
va_arg(ap,t),它的第一个参数指向可变参数字符串的变量ap,第二个参数是可变参数的类型,type。
va_end(ap) 用于将存放可变参数字符串的变量ap清空(赋值为NULL).
使用这几个宏,请包含头文件,#include <stdarg.h>
.注意的是,由于宏只有简单的替换作用,所以在不定参数函数的实现中是需要将数据格式format传入,这样才能正确的使用。实例如下:
#include "stdafx.h"
#include <stdarg.h>
/*
* brief:将文件输出到指定的文件当中
* param:
* fd:文件描述符
* format:不定参数的类型
* ...:不定参数
*/
void writefile(FILE *fd,const char *format, ...)
{
//va_list:创建参数va_list 变量
va_list ap;
//va_start;将指针移至不定参数表位置
va_start(ap, format);
//使用不定参数表
vfprintf(fd,format,ap);
//va_end;释放va_list变量
va_end(ap);
}
int _tmain(int argc, _TCHAR* argv[])
{
FILE *fd = NULL;
fopen_s(&fd, "C:/Users/asus/Desktop/text.txt", "a+");
//调用不定参数函数
writefile(fd,"%s%s! ","hello","va_list");
writefile(fd, "%s(%d) is %s !", "I", 23, "Kobe");
return 0;
}
输出结果如图所示:
对于va_arg()宏的使用,则可以在使用不定参数表的时候,将参数一个一个按照类型拆解出来,直到ap为NULL.
#include <stdarg.h>
#include <stdio.h>
int sum(int, ...);
int main()
{
printf("15 和 56 的和 = %d\n", sum(2, 15, 56) );
return 0;
}
int sum(int num_args, ...)
{
int val = 0;
va_list ap;
int i;
va_start(ap, num_args);
for(i = 0; i < num_args; i++)
{
val += va_arg(ap, int);
}
va_end(ap);
return val;
}