不定參的宏定義使用

什麼是不定參

函數中的參數個數可以不固定,比如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__表示當前所在的文件的路徑
// 如果你在宏調用時,確實提供了一些可變/參數,它會把這些可變參數放到逗號的後面。如果沒有’##’操作將使預處理器去除掉它前面的那個逗號。使其仍可正常工作。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章