不定参的宏定义使用

什么是不定参

函数中的参数个数可以不固定,比如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__表示当前所在的文件的路径
// 如果你在宏调用时,确实提供了一些可变/参数,它会把这些可变参数放到逗号的后面。如果没有’##’操作将使预处理器去除掉它前面的那个逗号。使其仍可正常工作。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章