行云

行至水穷处,坐看云起时。

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

头文件: 调试开关在头文件中

#ifndef __DEBUG_ZWY_H__
#define __DEBUG_ZWY_H__

#include <stdio.h>
#include <stdarg.h>

#define _DBG_
#define _DBG_LEVEL_INFO_

//define _DBG_ to open debug
#ifdef _DBG_
    #ifdef _DBG_LEVEL_INFO_    
/* 如果定义了调试级别为INFO, 那么同时打开WARN, ERR开关*/
        #ifndef _DBG_LEVEL_WARN_
            #define _DBG_LEVEL_WARN_
        #endif
        
        #ifndef _DBG_LEVEL_ERR_
            #define DBG_LEVER_ERR
        #endif    
    #endif
    /* 如果定义了调试级别为WARN, 那么同时打开ERR开关*/
    #ifdef _DBG_LEVEL_WARN_    
        #ifndef _DBG_LEVEL_ERR_
            #define _DBG_LEVEL_ERR_
        #endif    
    #endif
//_DBG_LEVEL_ERR_ for default
    #ifndef _DBG_LEVEL_ERR_
        #define _DBG_LEVEL_ERR_
    #endif
#endif


void __DBG_INFO (const char* file, int line, const char *format, ...);
void __DBG_WARN (const char* file, int line, const char *format, ...);
void __DBG_ERR (const char* file, int line, const char *format, ...);
//redirect print to files
void  px_dbg_start(FILE *err, FILE *warn, FILE *info);

#ifdef _DBG_
    #ifdef _DBG_LEVEL_INFO_
        #define DBG_INFO(format, args...) __DBG_INFO(__FILE__, __LINE__, format, ##args)    
    #else
        #define DBG_INFO(format, args...)    
    #endif
#else 
    #define DBG_INFO(format, args...)    
#endif
/*************************************************/
#ifdef _DBG_
    #ifdef _DBG_LEVEL_WARN_
        #define DBG_WARN(format, args...) __DBG_WARN(__FILE__, __LINE__, format, ##args)
    #else
        #define DBG_WARN(format, args...)    
    #endif
#else 
    #define DBG_WARN(format, args...)    
#endif

/**********************************************/
#ifdef _DBG_
    #ifdef _DBG_LEVEL_ERR_
        #define DBG_ERR(format, args...) __DBG_ERR(__FILE__, __LINE__, format, ##args)
    #else
        #define DBG_ERR(format, args...)
    #endif
#else 
    #define DBG_ERR(format, args...)
#endif


#endif

.C文件

#include "debugtool.h"


FILE *g_err_file = NULL;
FILE *g_warn_file = NULL;
FILE *g_info_file = NULL;

/*
    If you want to redirect the output, use the function
    eg: If you want to output the error message to a file, you can reassign a value to the err_file
*/
void  px_dbg_start(FILE *err, FILE *warn, FILE *info) 
{
  
    if (err)
        g_err_file = err;
    if (err)
        g_warn_file = warn;
    if (info)
        g_info_file = info;
}

void __DBG_INFO (const char* file, int line, const char *format, ...)
{
    if (g_info_file == NULL)
        g_info_file = stdout;
    va_list ap;
    va_start (ap, format);
    fprintf (g_info_file, "INFO: File[ %s ], at Line[ %-5d ] : ", file, line);
    vfprintf (g_info_file, format, ap);
    fflush(g_info_file);
    va_end (ap);
}
void __DBG_WARN (const char* file, int line, const char *format, ...)
{
    if (g_warn_file == NULL)
        g_warn_file = stderr;

    va_list ap;
    va_start (ap, format);
    fprintf (g_warn_file, "WARN: File[ %s ], at Line[ %-5d ] : ", file, line);
    vfprintf (g_warn_file, format, ap);
    fflush(g_warn_file);
    va_end (ap);
}
void __DBG_ERR (const char* file, int line, const char *format, ...)
{
    if (g_err_file == NULL)
        g_err_file = stderr;
    va_list ap;
    va_start (ap, format);
    fprintf (g_err_file, "ERR : File[ %s ], at Line[ %-5d ] : ", file, line);
    vfprintf (g_err_file, format, ap);
    fflush(g_err_file);
    va_end (ap);
}

支持3中调试级别,重定向个级别输出。
优点:如果未打开调试开关,调试信息输出函数将不会被编译进目标文件中(宏替换时替换为空了),更没有运行时开销。
缺点:调试开关在头文件中,这样有点不太方便,不能自定义各模块调试级别。

posted on 2013-01-09 21:59  windflying  阅读(1291)  评论(0编辑  收藏  举报