C++的最小条件日志记录

Minimal conditional logging for C++

本文关键字:日志 记录 条件 C++      更新时间:2023-10-16

我正在开发嵌入式项目,为了调试目的,在代码中记录信息非常方便,但完整的C++记录器库在嵌入式环境中很难使用你能建议如何实现简单、干净、快速的日志记录模块吗我真的不需要对日志后端、输出、级别等进行精细控制。我只想在不模糊代码的情况下启用和禁用日志语句。目前我是这样做的:

#define DEBUG_ENCODER_PRINTF
// ...
#ifdef DEBUG_ENCODER_PRINTF
    debug_printf("enc: %d %drn",
                 get_encoder_unwrapped(0),
                 get_encoder_unwrapped(1));
#endif

但我已经有了几十个不同的日志记录语句,而且很多预处理器定义让代码看起来很难看。

如果你这样做,你可以消除那些讨厌的#ifdef#endif

#ifdef DEBUG_ENCODER_PRINTF
    #define debug_encoder_printf debug_printf
#else
    #define debug_encoder_printf(...)
#endif

当定义了DEBUG_ENCODER_PRINTF时,debug_encoder_printf("hi")现在将调用debug_printf,但如果未定义,则预处理器将删除整个"调用"(不替换任何内容)。

我最后是这样做的:

#define DEBUG_PRINTF_ENABLED
#define DEBUG_SONAR_PRINTF       false
#define DEBUG_ENCODER_PRINTF     true
// ... 
#ifdef DEBUG_PRINTF_ENABLED
#   define DEBUG_PRINTF(logger, pFormat, ...)
    { if (DEBUG_##logger##_PRINTF) debug_printf(pFormat, __VA_ARGS__); }
#else
#   define DEBUG_PRINTF(...)
#endif
// ...
DEBUG_PRINTF(ENCODER,
             "enc: %d %drn",
             get_encoder_unwrapped(0),
             get_encoder_unwrapped(1));