不定参的宏定义使用

来源:互联网 发布:最优化理论与算法课件 编辑:程序博客网 时间:2024/06/05 15:20

什么是不定参

函数中的参数个数可以不固定,比如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__表示当前所在的文件的路径// 如果你在宏调用时,确实提供了一些可变/参数,它会把这些可变参数放到逗号的后面。如果没有’##’操作将使预处理器去除掉它前面的那个逗号。使其仍可正常工作。
0 0