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