什么是不定参
函数中的参数个数可以不固定,比如printf()函数可以一次输出若干个变量的值,这种情况就叫做不定参函数。
不定参的使用
//test.h
#include<stdio.h>
#include<stdarg.h>
void writeLog(int line,const char *fromat, ...)
{
va_list args;
static char logText[MAXLOGSIZE] = { 0 };
//获取日志信息
va_start(args, fromat);
PrintfLog(fromat, args, logText);
va_end(args);
//将日志信息输出到日志文件和控制台
sprintf(text, "[%d行] %s\n", line, logText);
printf("%s\n", text);
}
//不定参打印
static void PrintfLog(const char * fromat, va_list args, char *dst)
{
int d;
char c, *s;
while (*fromat)
{
if (*(fromat - 1) == '%')
{
switch (*fromat) {
case 's':
s = va_arg(args, char *);
strcat(dst, s);
break;
case 'd':
d = va_arg(args, int);
char str[255];
sprintf(str, "%d", d);
strcat(dst,str);
break;
case 'c':
c = (char)va_arg(args, int);
dst[strlen(dst)] = c;
break;
default:
if (*fromat != '%'&&*fromat != '\n')
dst[strlen(dst)] = *fromat;
break;
}
}
else
{
if (*fromat != '%'&&*fromat != '\n')
dst[strlen(dst)] = *fromat;
}
fromat++;
}
}
#include<test.h>
int main()
{
writeLog(__LINE__, "%s:%d", "测试", 2);//__LINE__表示当前代码行数
getchar();
return 0;
}
运行结果:
可以看出成功打印出了传进函数的两个参数。
不定参的宏定义使用
#define LOG(s,...) (writeLog(__FILE__,__LINE__,s,##__VA_ARGS__))
//__FILE__表示当前所在的文件的路径
// 如果你在宏调用时,确实提供了一些可变/参数,它会把这些可变参数放到逗号的后面。如果没有’##’操作将使预处理器去除掉它前面的那个逗号。使其仍可正常工作。