C/C++打印带颜色的调试信息

虽然有gdb和IDE等调试工具,但在编程和调试的过程中,打印调试信息还是必不可少的——它方便、快捷,尤其是对于需要依赖关系错综复杂的大型工程,在关键的地方打印调试信息非常行之有效。不过调试信息打的多了,看着满屏幕的小字实在眼晕——而且,在正式版本发布的时候,还需要一行一行地删除这些调试信息,实在是个苦力活儿。于是,这两天写了一个打印带颜色的调试信息的工具,可以打印出各种各样颜色的信息,这样调试的时候看起来就方便多了,重要的信息可以一目了然。同时,这个工具和assert类似,只有在debug模式编译的时候才生效,在release模式编译时相当于一条空语句,这样就省去了删除/注释这些调试信息的功夫。

这个debug工具的代码如下:

/*
 * Copyright 2012@jike.com. All rights reserved.
 * 
 * debug_info.h
 *
 *    Created on: 2012-10-17
 *        Author: zhangrui@jike.com
 *   Description: This is used to print colorful debug infos to help
 *   us with debugging.
 */

#ifndef ECOM_BASE_DEBUG_INFO_H_
#define ECOM_BASE_DEBUG_INFO_H_

#define NONE "\033[m"
#define RED "\033[0;31m"
#define LIGHT_RED "\033[1;31m"
#define GREEN "\033[0;32;32m"
#define LIGHT_GREEN "\033[1;32m"
#define BLUE "\033[0;32;34m"
#define LIGHT_BLUE "\033[1;34m"
#define DARY_GRAY "\033[1;30m"
#define CYAN "\033[0;36m"
#define LIGHT_CYAN "\033[1;36m"
#define PURPLE "\033[0;35m"
#define LIGHT_PURPLE "\033[1;35m"
#define BROWN "\033[0;33m"
#define YELLOW "\033[0;33m"
#define LIGHT_YELLOW "\033[1;33m"
#define LIGHT_GRAY "\033[0;37m"
#define WHITE "\033[1;37m"

#define COLORFUL_PRINT(color, fmt, arg...) \
    do { \
        printf(color fmt NONE, ##arg); \
    } while(0)

#define PRINT_RED(fmt, arg...) \
    COLORFUL_PRINT(RED, fmt, ##arg)
#define PRINT_LRED(fmt, arg...) \
    CLORFUL_PRINT(LIGHT_RED, fmt, ##arg)
#define PRINT_GREEN(fmt, arg...) \
    CLORFUL_PRINT(GREEN, fmt, ##arg)
#define PRINT_LGREEN(fmt, arg...) \
    CLORFUL_PRINT(LIGHT_GREEN, fmt, ##arg)
#define PRINT_BLUE(fmt, arg...) \
    CLORFUL_PRINT(BLUE, fmt, ##arg)
#define PRINT_LBLUE(fmt, arg...) \
    CLORFUL_PRINT(LIGHT_BLUE, fmt, ##arg)
#define PRINT_GRAY(fmt, arg...) \
    CLORFUL_PRINT(DARY_GRAY, fmt, ##arg)
#define PRINT_LGRAY(fmt, arg...) \
    COLORFUL_PRINT(LIGHT_GRAY, fmt, ##arg)
#define PRINT_CYAN(fmt, arg...) \
    CLORFUL_PRINT(CYAN, fmt, ##arg)
#define PRINT_LCYAN(fmt, arg...) \
    CLORFUL_PRINT(LIGHT_CYAN, fmt, ##arg)
#define PRINT_PURPLE(fmt, arg...) \
    CLORFUL_PRINT(PURPLE, fmt, ##arg)
#define PRINT_LPURPLE(fmt, arg...) \
    CLORFUL_PRINT(LIGHT_PURPLE, fmt, ##arg)
#define PRINT_BROWN(fmt, arg...) \
    CLORFUL_PRINT(BROWN, fmt, ##arg)
#define PRINT_YELLOW(fmt, arg...) \
    CLORFUL_PRINT(YELLOW, fmt, ##arg)
#define PRINT_LYELLOW(fmt, arg...) \
    CLORFUL_PRINT(LIGHT_YELLOW, fmt, ##arg)
#define PRINT_WHITE(fmt, arg...) \
    CLORFUL_PRINT(WHITE, fmt, ##arg)

#ifdef NDEBUG
  #ifdef DEBUG_MESSAGE
  #undef DEBUG_MESSAGE
  #endif
  #define DEBUG_MESSAGE(color, fmt, arg...) ((void)(0))
#else
  #ifdef DEBUG_MESSAGE
  #undef DEBUG_MESSAGE
  #endif
  #define DEBUG_MESSAGE(color, fmt, arg...) \
    do { \
      time_t __cur_time__ = time(NULL); \
      struct tm __cur_tm__; \
      localtime_r(&__cur_time__, &__cur_tm__); \
      COLORFUL_PRINT(color, \
          "[%04d-%02d-%02d %02d:%02d:%02d : %s(%d)]:" fmt "\n", \
          __cur_tm__.tm_year + 1900, __cur_tm__.tm_mon, __cur_tm__.tm_mday, \
          __cur_tm__.tm_hour, __cur_tm__.tm_min, __cur_tm__.tm_sec, \
          __FILE__, __LINE__, ##arg); \
      } while(0)
#endif

#ifdef DEBUG_ERROR
#undef DEBUG_ERROR
#endif
#ifdef DEBUG_WARNING
#undef DEBUG_WARNING
#endif
#ifdef DEBUG_INFO
#undef DEBUG_INFO
#endif

#define DEBUG_ERROR(fmt, arg...) DEBUG_MESSAGE(RED, fmt, ##arg)
#define DEBUG_WARNING(fmt, arg...) DEBUG_MESSAGE(YELLOW, fmt, ##arg)
#define DEBUG_INFO(fmt, arg...) DEBUG_MESSAGE(NONE, fmt, ##arg)

#endif  // ECOM_BASE_DEBUG_INFO_H_



一个简单的例子及运行结果:

#include "debug_info.h"
#include <cstdio>
#include <string>
//#include <ctime>
int main() {
    std::string str = "Congratulations!";
    int a = 5;
    int b = 10;
    DEBUG_ERROR("If you can run this....%s, %d, %d", str.c_str(), a, b);
    return 0;
}

运行结果:


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第1篇 编程基础 第1章 开发环境 1.1 工程创建 实例001如何创建基于对话框的MFC工程 实例002如何创建基于文档视图的MFC工程, 实例003打开已存在的工程 实例004怎样查找工程中的信息 实例005怎样在添加对话框资源时创建对话框类 实例006在工作区中管理多个工程 实例007创建MFCActiveX工程 实例008创建ATL工程 实例009创建控制台应用程序 1.2 开发环境设置与使用 实例010怎样定制自己的工具栏 实例011在VC项目中使用自定义资源 实例012向VisualC++开发环境中添加插件 实例013添加消息处理函数 实例014设置开发环境文本颜色 实例015设置批量注释 实例016如何对齐零乱的代码 实例017判断代码中的括号是否匹配 实例018修改可执行文件中的资源 1.3 程序调试 实例019创建调试程序 实例020在Release版本中进行调试 实例021在vc中如何进行远程调试 实例022利用简单断点进行程序调试 实例023利月条件断点进行程序调试 实例024利用数据断点进行程序调试 实例025利用消息断点进行程序调试 实例026利用Watch调试窗口查看对象信息 实例027利用CallStack窗口查看函数调用信息 实例028利用Memory窗口查看内存信息 实例029利用Variables窗口查看变量信息 实例030利用Registers窗口查看CPU寄存器信息 实例031利用Disassembly窗口查看汇编信息 第2章 语言基础 2.1 基本语法 实例032输出问候语 实例033输出边框的问候语 实例034不同类型数据的输出 实例035输出字符表情, 实例036获取用户输入的用户名 2.2 运算符的妙用 实例037简单的字符加密 实例038实现两个变量的互换 实例039判断性别 实例040用宏定义实现值互换 实例041简单的位运算 实例042整数加减法练习 2.3 条件语句 实例043李白喝酒问题 实例044桃园三结义 实例045何年是闰年 实例046小球称重 实例047购物街中的商品价格竞猜 实例048促销商品的折扣计算 实例049利用switch语句输出倒三角形 2.4 循环语句 实例050PK少年高斯 实例051灯塔数量 实例052上帝创世的秘密 实例053小球下落 实例054再现乘法口诀表 实例055判断名次 2.5 循环的数学应用 实例056序列求和 实例057简单的级数运算 实例058求一个正整数的所有因子 实例059一元钱兑换方案 2.6 趣味计算 实例060加油站加油 实例061买苹果问题 实例062猴子吃桃 实例063老师分糖果 实例064新同学的年龄 实例065百钱买百鸡问题 实例066彩球问题 实例067集邮册中的邮票数量 2.7 多重循环打印图形 实例068用打印三角形 实例069用叶印图形 实例070绘制余弦曲线 实例071打印杨辉三角 2.8 算法 实例072计算某日是该年第几天 实例073斐波那契数列 实例074角谷猜想 实例075哥德巴赫猜想 实例076四方定理 实例077尼科彻斯定理 实例078魔术师的秘密

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值