定制自己的打印函数---进阶篇

继续上次的整理,今天是进阶版本,首先整理一下升级后的需求:

  • 满足初级篇中的所有需求;
  • 针对打印信息的重要程度分为不同的级别;
  • 根据不同的级别进行配色,方便进行鉴别;
  • 根据不同的级别控制打印信息的输出;

需求有了,下面让我们来制定相应的规则,首先来看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("33[3%dm[%s:%d]"format"33[0m", MY_PRINT_COLOR_DEBUG, __FILE__, __LINE__, ##__VA_ARGS__) #define myalert(format, ...) printf("33[3%dm[%s:%d]"format"33[0m", MY_PRINT_COLOR_ALERT, __FILE__, __LINE__, ##__VA_ARGS__) #define myerror(format, ...) printf("33[3%dm[%s:%d]"format"33[0m", MY_PRINT_COLOR_ERROR, __FILE__, __LINE__, ##__VA_ARGS__) #define myfatal(format, ...) printf("33[3%dm[%s:%d]"format"33[0m", MY_PRINT_COLOR_FATAL, __FILE__, __LINE__, ##__VA_ARGS__) #elif (MY_PRINT_LEVEL == MY_PRINT_LEVEL_ALERT) #define mydebug(format, ...) #define myalert(format, ...) printf("33[3%dm[%s:%d]"format"33[0m", MY_PRINT_COLOR_ALERT, __FILE__, __LINE__, ##__VA_ARGS__) #define myerror(format, ...) printf("33[3%dm[%s:%d]"format"33[0m", MY_PRINT_COLOR_ERROR, __FILE__, __LINE__, ##__VA_ARGS__) #define myfatal(format, ...) printf("33[3%dm[%s:%d]"format"33[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("33[3%dm[%s:%d]"format"33[0m", MY_PRINT_COLOR_ERROR, __FILE__, __LINE__, ##__VA_ARGS__) #define myfatal(format, ...) printf("33[3%dm[%s:%d]"format"33[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("33[3%dm[%s:%d]"format"33[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

原文地址:https://www.cnblogs.com/panhongyin/p/5623507.html