我有一个多文件C程序.我希望用户能够在运行时指定不同的调试级别.
实现这个的最佳方法是什么?
我正在考虑将调试(级别,"消息")类型函数导出并在任何地方使用.还有更好的/其他想法吗?
Jonathan的建议很好但是从C99开始我们就有了可变参数宏,所以不需要对调试宏使用双括号.
我使用的是日志标头的简易版本:
#define LOG_FATAL (1) #define LOG_ERR (2) #define LOG_WARN (3) #define LOG_INFO (4) #define LOG_DBG (5) #define LOG(level, ...) do { \ if (level <= debug_level) { \ fprintf(dbgstream,"%s:%d:", __FILE__, __LINE__); \ fprintf(dbgstream, __VA_ARGS__); \ fprintf(dbgstream, "\n"); \ fflush(dbgstream); \ } \ } while (0) extern FILE *dbgstream; extern int debug_level;
所以,无论我需要记录什么,我只需添加一行
LOG(LOG_ERR, "I/O error %s occured while opening file %s", strerror(errno), filename);
在程序初始化期间,您需要指定dbgstream
(通常默认为stderr
)和的值debug_level
.
对于真正的项目而不是fprintf
多次调用我只是从LOG
宏调用我的函数并传递__FILE__
,__LINE__
并且__VA_ARGS_
作为参数 - 该函数还在日志行中打印日期,时间和pid,并且不是fflush()
每次都执行 - 仅当缓冲计数器超过预设值时 - 显着提高测井性能.
但请注意,某些编译器可能不支持可变参数宏,因为它仅在C99中引入.