什麼是不定參
函數中的參數個數可以不固定,比如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__表示當前所在的文件的路徑
// 如果你在宏調用時,確實提供了一些可變/參數,它會把這些可變參數放到逗號的後面。如果沒有’##’操作將使預處理器去除掉它前面的那個逗號。使其仍可正常工作。