定制自己的打印函数---进阶篇
继续上次的整理,今天是进阶版本,首先整理一下升级后的需求:
- 满足初级篇中的所有需求;
- 针对打印信息的重要程度分为不同的级别;
- 根据不同的级别进行配色,方便进行鉴别;
- 根据不同的级别控制打印信息的输出;
需求有了,下面让我们来制定相应的规则,首先来看2.3两项,级别和配色问题,这个问题会因人而异,所以我只给出我个人的思考结果。我定义的级别分成四个等级,并分别对应不同的颜色,如下所示:
- 级别一:调试信息(绿色),比如打印一些变量值或者跟踪程序的执行流程等;
- 级别二:警告信息(黄色),比如参数非法或者调用某些不太重要的函数失败等;
- 级别三:一般错误(红色),针对比较重要的错误,但还不至于终止程序,比如调用一些系统接口失败等;
- 级别四:重大错误(紫色),针对非常严重的错误,需要终止程序的运行,比如内存申请失败等;
大体规则就是这样,颜色主要是针对Linux终端的默认配色规则,至于函数命名,我的命名规则分别是:
- #define mydebug(format, ...)
- #define myalert(format, ...)
- #define myerror(format, ...)
- #define myfatal(format, ...)
下面来看实现:
#ifndef __MY_DEBUG_H__ #define __MY_DEBUG_H__ #include <stdio.h> #define MY_PRINT_LEVEL_NULL (0) #define MY_PRINT_LEVEL_DEBUG (1) #define MY_PRINT_LEVEL_ALERT (2) #define MY_PRINT_LEVEL_ERROR (3) #define MY_PRINT_LEVEL_FATAL (4) #define MY_PRINT_COLOR_DEBUG (2) //green #define MY_PRINT_COLOR_ALERT (3) //yellow #define MY_PRINT_COLOR_ERROR (1) //red #define MY_PRINT_COLOR_FATAL (5) //purple #define MY_PRINT_LEVEL MY_PRINT_LEVEL_DEBUG //use for change print level
#if (MY_PRINT_LEVEL == MY_PRINT_LEVEL_DEBUG) #define mydebug(format, ...) printf("\033[3%dm[%s:%d]"format"\033[0m", MY_PRINT_COLOR_DEBUG, __FILE__, __LINE__, ##__VA_ARGS__) #define myalert(format, ...) printf("\033[3%dm[%s:%d]"format"\033[0m", MY_PRINT_COLOR_ALERT, __FILE__, __LINE__, ##__VA_ARGS__) #define myerror(format, ...) printf("\033[3%dm[%s:%d]"format"\033[0m", MY_PRINT_COLOR_ERROR, __FILE__, __LINE__, ##__VA_ARGS__) #define myfatal(format, ...) printf("\033[3%dm[%s:%d]"format"\033[0m", MY_PRINT_COLOR_FATAL, __FILE__, __LINE__, ##__VA_ARGS__) #elif (MY_PRINT_LEVEL == MY_PRINT_LEVEL_ALERT) #define mydebug(format, ...) #define myalert(format, ...) printf("\033[3%dm[%s:%d]"format"\033[0m", MY_PRINT_COLOR_ALERT, __FILE__, __LINE__, ##__VA_ARGS__) #define myerror(format, ...) printf("\033[3%dm[%s:%d]"format"\033[0m", MY_PRINT_COLOR_ERROR, __FILE__, __LINE__, ##__VA_ARGS__) #define myfatal(format, ...) printf("\033[3%dm[%s:%d]"format"\033[0m", MY_PRINT_COLOR_FATAL, __FILE__, __LINE__, ##__VA_ARGS__) #elif (MY_PRINT_LEVEL == MY_PRINT_LEVEL_ERROR) #define mydebug(format, ...) #define myalert(format, ...) #define myerror(format, ...) printf("\033[3%dm[%s:%d]"format"\033[0m", MY_PRINT_COLOR_ERROR, __FILE__, __LINE__, ##__VA_ARGS__) #define myfatal(format, ...) printf("\033[3%dm[%s:%d]"format"\033[0m", MY_PRINT_COLOR_FATAL, __FILE__, __LINE__, ##__VA_ARGS__) #elif (MY_PRINT_LEVEL == MY_PRINT_LEVEL_FATAL) #define mydebug(format, ...) #define myalert(format, ...) #define myerror(format, ...) #define myfatal(format, ...) printf("\033[3%dm[%s:%d]"format"\033[0m", MY_PRINT_COLOR_FATAL, __FILE__, __LINE__, ##__VA_ARGS__) #else #define mydebug(format, ...) #define myalert(format, ...) #define myerror(format, ...) #define myfatal(format, ...) #endif #endif // __MY_DEBUG_H__
OK,大功告成,有人也许会说,为什么用宏定义不用函数实现,那样可以节省一些代码,但我个人认为这样效率更高,而且代码也没多多少。好了,目前所实现的功能只是针对小工程而言的,如果工程稍微大一些,也许就会提出更高的要求了,比如我想可以按照模块进行打印输出,并且每个模块是可以单独可控的等等,鉴于个人时间问题,后期有时间会继续整理,咱们后会有期......
作者:潘洪银
地址:http://www.cnblogs.com/panhongyin