C语言自定义打印宏函数

在调试大型项目中,打印信息分级和指出打印所在处,更方便于解决问题。查阅网上的文章并加上自己的修改,实现了个简单的宏打印函数来达到目的。宏函数实现在头文件中,加上了打印级别来控制打印是否输出,打印级别的设定需在调用的.c文件中自定义(这样做是为了能实现不同文件的打印级别能不一样,在调试指定文件或模块的问题是,能起到屏蔽其他无关代码打印的作用)。

typedef.h源码:

#ifndef _TYPEDEF_H_
#define _TYPEDEF_H_
#include < stdarg.h>

#define INFO_OUTPUT      3
#define WARNING_OUTPUT   2
#define DEBUG_OUTPUT     1
#define ERROR_OUTPUT     0

//#define DEBUG_LEVEL      DEBUG_OUTPUT
//需在使用以下打印宏的.c文件中定义“DEBUG_LEVEL”变量
#define INFO_PRINT(info,...)  \
do{ \
    if(DEBUG_LEVEL>=INFO_OUTPUT){\
        printf("Info %s,%s,%d:"info"",__FILE__,__FUNCTION__,__LINE__,##__VA_ARGS__);}\
}while(0)

#define WARNING_PRINT(info,...)  \
do{ \
    if(DEBUG_LEVEL>=WARNING_OUTPUT){\
        printf("Warning %s,%s,%d:"info"",__FILE__,__FUNCTION__,__LINE__,##__VA_ARGS__);}\
}while(0)

#define DEBUG_PRINT(info,...)  \
do{ \
    if(DEBUG_LEVEL>=DEBUG_OUTPUT){\
        printf("Debug %s,%s,%d:"info"",__FILE__,__FUNCTION__,__LINE__,##__VA_ARGS__);}\
}while(0)

#define ERROR_PRINT(info,...)  \
do{ \
    if(DEBUG_LEVEL>=ERROR_OUTPUT){\
        printf("Error %s,%s,%d:"info"",__FILE__,__FUNCTION__,__LINE__,##__VA_ARGS__);}\
}while(0)

#endif

 

测试代码main.c:

#include<stdio.h>
#include<Windows.h>
#include "typedef.h"

static int DEBUG_LEVEL = DEBUG_OUTPUT;

void main(int argc,char **argv)
{
    INFO_PRINT("hello %s\n", "world!");
    WARNING_PRINT("hello %s\n", "world!");
    DEBUG_PRINT("hello %s\n","world!");
    ERROR_PRINT("hello %s\n", "world!");
    while (1)
    {
        Sleep(1000);
    }

打印结果:

C语言自定义打印宏函数

 

注:在宏定义函数printf中info用双引号括起来,是因为由于按照使用printf函数的习惯,在使用的时候的,info传入是带双引号括起来的格式化字符串,如:DEBUG_PRINTT("input %d,%s\n",123,"abd");替换到宏里面的printf则为printf("Debug %s,%s,%d:""input %d,%s\n""",__FILE__,__FUNCTION__,__LINE__,123,"abd");这里利用了printf(“number1 ”  "number2 "   "number3"); 等价于printf("number1 number2 number3");的原理(如下图)保证打印输出达到想要的效果。按照这个原理可把DEBUG_PRINTT("input %d,%s\n",123,"abd");替换到宏里面并拆解成以下语句便能理解:printf("Debug %s,%s,%d:"   "input %d,%s\n"    "",__FILE__,__FUNCTION__,__LINE__,123,"abd");

C语言自定义打印宏函数