打印调试之简单彩色输出文件名和行号等调试信息

分享自己写了个方便打印调试的一点代码,可用于Windows和Linux平台,希望对某些朋友有用。C语言初学者,希望大家多多指点下。

/****************************************************************//**
    @file       debug-inl.h    
    @author     idi0t
    @brief      as printf();
    @time       2013-7-1
    @version    1.0
*********************************************************************/
#ifndef _HAVE_DEBUG_H
#define _HAVE_DEBUG_H

#include <stdio.h>
#include <string.h>
#ifdef WIN32
    #include <windows.h>
//    #define _MSC_VER            1200    //VC6.0
//    #define _MSC_VER            1400    //VC7.0
#endif

#define PRINT_LEN            2048
#define HAVE_USE_COLOR        1
#define HAVE_SHOW_DBG        1        /* Show filename and line */

#ifdef HAVE_SHOW_DBG
#define SHOW_LINE                do { printf(":%d] ",__LINE__); } while(0)
    #ifdef WIN32
        #define SHOW_FILE        do { \
            printf(strrchr(__FILE__,'\\')?strrchr(__FILE__,'\\')+1:__FILE__); \
        }while(0)
        #if MSC_VER > 1200
            #define SHOW_FUNC    do { printf(__FUNCTION__); } while(0)
        #else
            #define SHOW_FUNC
        #endif
    #else
        #define SHOW_FILE        do { printf(strrchr(__FILE__,'/')+1); } while(0)
        #define SHOW_FUNC        do { printf(__FUNCTION__); } while(0)
    #endif
    #define SHOW_FILE_LINE    do {SHOW_FILE; SHOW_LINE; } while(0)
#else
    #define SHOW_FILE
    #define SHOW_LINE
    #define SHOW_FUNC
    #define SHOW_FILE_LINE
#endif    /* ^HAVE_SHOW_DBG */

#ifdef HAVE_USE_COLOR
    #ifdef WIN32
        #define cRST (FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE)
        #define cBLK 0
        #define cRED (FOREGROUND_RED)
        #define cGRN (FOREGROUND_GREEN)
        #define cBLU (FOREGROUND_BLUE)
        #define cYEL (FOREGROUND_RED | FOREGROUND_GREEN )
        #define cMGN (FOREGROUND_RED | FOREGROUND_BLUE)
        #define cCYA (FOREGROUND_GREEN | FOREGROUND_BLUE)
        #define cNOR (FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY)
        #define cGRA (FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE)
        #define cLRD (FOREGROUND_RED | FOREGROUND_INTENSITY)
        #define cLGN (FOREGROUND_GREEN | FOREGROUND_INTENSITY)
        #define cLYL (FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY)
        #define cLBL (FOREGROUND_BLUE | FOREGROUND_INTENSITY)
        #define cPIN (FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY)
        #define cLCY (FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY)
        #define cBRI cRST
    #else
        #define cBLK "\x1b[0;30m"
        #define cRED "\x1b[0;31m"
        #define cGRN "\x1b[0;32m"
        #define cYEL "\x1b[0;33m"
        #define cBLU "\x1b[0;34m"
        #define cMGN "\x1b[0;35m"
        #define cCYA "\x1b[0;36m"
        #define cNOR "\x1b[0;37m"
        #define cGRA "\x1b[1;30m"
        #define cLRD "\x1b[1;31m"
        #define cLGN "\x1b[1;32m"
        #define cLYL "\x1b[1;33m"
        #define cLBL "\x1b[1;34m"
        #define cPIN "\x1b[1;35m"
        #define cLCY "\x1b[1;36m"
        #define cBRI "\x1b[1;37m"
        #define cRST "\x1b[0m"
    #endif    /* ^WIN32 */
#else
    #ifdef WIN32
        #define cRST (FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE)
        #define cBLK cRST    /* 黑 */
        #define cRED cRST    /* 红 */
        #define cGRN cRST    /* 绿 */
        #define cYEL cRST    /* 棕 */
        #define cBLU cRST    /* 蓝 */
        #define cMGN cRST    /* 紫 */
        #define cCYA cRST    /* 浅蓝 */
        #define cNOR cRST    /* 浅灰 */
        #define cGRA cRST    /* 灰 */
        #define cLRD cRST    /* 亮红 */
        #define cLGN cRST    /* 亮绿 */
        #define cLYL cRST    /* 亮黄 */
        #define cLBL cRST    /* 亮蓝 */
        #define cPIN cRST    /* 亮紫 */
        #define cLCY cRST    /* 亮浅蓝 */
        #define cBRI cRST    /* 灰 */
        

    #else
        #define cBLK ""        /* 黑 */
        #define cRED ""        /* 红 */
        #define cGRN ""        /* 绿 */
        #define cYEL ""        /* 黄 */
        #define cBLU ""        /* 蓝 */
        #define cMGN ""        /* 紫 */
        #define cCYA ""        /* 浅蓝 */
        #define cNOR ""        /* 浅灰 */
        #define cGRA ""        /* 灰 */
        #define cLRD ""        /* 亮红 */
        #define cLGN ""        /* 亮绿 */
        #define cLYL ""        /* 亮黄 */
        #define cLBL ""        /* 亮蓝 */
        #define cPIN ""        /* 亮紫 */
        #define cLCY ""        /* 亮浅蓝 */
        #define cBRI ""        /* 灰 */
        #define cRST ""
    #endif /* ^WIN32 */
#endif /* ^HAVE_USE_COLOR */

#ifdef WIN32
    #if _MSC_VER > 1200
        #define _win_printf(clr, x...) do { \
            HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); \
            SetConsoleTextAttribute(hOut, clr); \
            printf(x); \
            SetConsoleTextAttribute(hOut, cRST); \
        } while(0)
    #else
        static inline void _win_printf(unsigned short clr, char *fmt, ...)
        {
            HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
            char buf[PRINT_LEN] = {0};
            va_list args;

            va_start(args, fmt);
            _vsnprintf(buf, sizeof(buf)-1, fmt, args);
            va_end(args);

            SetConsoleTextAttribute(hOut, clr);
            printf("%s",buf);
            SetConsoleTextAttribute(hOut, cRST);
        }
        static inline _abt_printf(char *fmt, ...)
        {
            char buf[PRINT_LEN] = {0};
            va_list args;

            va_start(args, fmt);
            _vsnprintf(buf, sizeof(buf)-1, fmt, args);
            va_end(args);
            
            printf("%s",buf);
            abort();
        }
    #endif    /* >MSC_VER */
    #ifndef    NDEBUG
        #if _MSC_VER > 1200
            #define clr_print _win_printf
            #define abt_print(x...) do { \
                    _win_printf(cLRD, x); abort(); \
                } while(0)
            #define dbg_print(x...) do { \
                    _win_printf(cLGN, "[DBG]:"); SHOW_FILE_LINE; printf(x); \
                }while(0)
            #define inf_print(x...) do { \
                    _win_printf(cLYL, "[INF]:"); SHOW_FILE_LINE; printf(x); \
                }while(0)
            #define err_print(x...) do { \
                    _win_printf(cLRD, "[ERR]:"); SHOW_FILE_LINE; printf(x); \
                }while(0)
            #define dbg_printc(clr, x...) do { \
                    _win_printf(cLGRN, "[DBG]:"); SHOW_FILE_LINE; \
                    _win_printf(clr, x); \
                }while(0)
            #define inf_printc(clr, x...) do { \
                    _win_printf(cLYL, "[INF]:"); SHOW_FILE_LINE; \
                    _win_printf(clr, x); \
                }while(0)
            #define err_printc(clr, x...) do { \
                    _win_printf(cLRD, "[ERR]:"); SHOW_FILE_LINE; \
                    _win_printf(clr, x); \
                }while(0)
        #else
            #define clr_print _win_printf
            #define abt_print _abt_printf
            #define dbg_print _win_printf(cLGN, "[DBG]:"), printf
            #define inf_print _win_printf(cLYL, "[INF]:"), printf
            #define err_print _win_printf(cLRD, "[ERR]:"), printf
            #define dbg_printc _win_printf(cLGN, "[DBG]:"), _win_printf
            #define inf_printc _win_printf(cLYL, "[INF]:"), _win_printf
            #define err_printc _win_printf(cLRD, "[ERR]:"), _win_printf
        #endif    /* >_MSC_VER */
    #else
        #if _MSC_VER > 1200
            #define clr_print(x...)
            #define dbg_print(x...)
            #define inf_print(x...)
            #define err_print(x...)
            #define dbg_printc(x...)
            #define inf_printc(x...)
            #define err_printc(x...)
        #else
            #define clr_print
            #define dbg_print
            #define inf_print
            #define err_print
            #define dbg_printc
            #define inf_printc
            #define err_printc
        #endif /* >_MSC_VER */
        
    #endif /* ^NDEBUG */
    
#else
/*
    static inline void _lnx_printf(int clr, char *fmt, ...)
    {
        char buf[PRINT_LEN] = {0};
        va_list args;

        va_start(args, fmt);
        vsnprintf(buf, sizeof(buf)-1, fmt, args);
        va_end(args);
        printf("%s%s",clr,buf);
        printf(cRST);
    }
*/
    #define _lnx_printf(clr, x...) do { \
        printf((clr)); \
        printf(x); \
        printf(cRST); \
    } while(0)
    #ifndef    NDEBUG
        #define clr_print _lnx_printf
        #define abt_print(x...) do { \
                _lnx_printf(cLRD, x); abort(); \
            } while(0)
        #define dbg_print(x...) do { \
                _lnx_printf(cLGN,"[DBG]:"); SHOW_FILE_LINE; \
                printf(x); \
            }while(0)
        #define inf_print(x...) do { \
                _lnx_printf(cLYL,"[INF]:"); SHOW_FILE_LINE; \
                printf(x); \
            }while(0)
        #define err_print(x...) do { \
                _lnx_printf(cLRD,"[ERR]:"); SHOW_FILE_LINE; \
                printf(x); \
            }while(0)
        #define dbg_printc(clr,x...) do { \
                _lnx_printf(cLGN,"[DBG]:"); SHOW_FILE_LINE; \
                _lnx_printf(clr,x); \
            }while(0)
        #define inf_printc(clr,x...) do { \
                _lnx_printf(cLYL,"[INF]:"); SHOW_FILE_LINE; \
                _lnx_printf(clr,x); \
            }while(0)
        #define err_printc(clr,x...) do { \
                _lnx_printf(cLRD,"[ERR]:"); SHOW_FILE_LINE; \
                _lnx_printf(clr,x); \
            }while(0)
    #else
        #define clr_print(x...)
        #define dbg_print(x...)
        #define inf_print(x...)
        #define err_print(x...)
        #define dbg_printc(x...)
        #define inf_printc(x...)
        #define err_printc(x...)
    #endif /* ^NDEBUG */
#endif    /* ^WIN32 */

#ifndef NDEBUG
/*  //for test 
    static inline void debug_test()
    {
        int i=0;
        err_print("hello world\n");
        dbg_print("hello world\n");
        inf_print("hello world\n");
        err_printc(cLRD,"hello world\n");
        dbg_printc(cLGN,"hello world\n");
        inf_printc(cLYL,"hello world\n");

        inf_printc(cRED,"cRED hello world\n");
        inf_printc(cGRN,"cGRN hello world\n");
        inf_printc(cYEL,"cYEL hello world\n");
        inf_printc(cBLU,"cBLU hello world\n");
        inf_printc(cMGN,"cMGN hello world\n");
        inf_printc(cCYA,"cCYA hello world\n");
        inf_printc(cNOR,"cNOR hello world\n");
        inf_printc(cGRA,"cGRA hello world\n");
        inf_printc(cLRD,"cLRD hello world\n");
        inf_printc(cLGN,"cLGN hello world\n");
        inf_printc(cLYL,"cLYL hello world\n");
        inf_printc(cLBL,"cLBL hello world\n");
        inf_printc(cPIN,"cPIN hello world\n");
        inf_printc(cLCY,"cLCY hello world\n");
        inf_printc(cBRI,"cBRI hello world\n");
    }
*/
#endif
#endif /* ! _HAVE_DEBUG_H */

 

posted @ 2013-07-17 15:44  idi0t  阅读(710)  评论(0编辑  收藏  举报