c++ logging - 如何为什么都不做的插入运算符编写条件宏

标签 c++ macros

我有一段代码使用了 plog用于日志记录,如下所示:

int main(int argc, char** argv) {

  static plog::ColorConsoleAppender<plog::TxtFormatter> consoleAppender;
  plog::init(plog::verbose, &consoleAppender);

  // Log severity levels are printed in different colors.
  LOG_VERBOSE << "This is a VERBOSE message";
  LOG_DEBUG << "This is a DEBUG message";
  LOG_INFO << "This is an INFO message";
  LOG_WARNING << "This is a WARNING message";
  LOG_ERROR << "This is an ERROR message";
  LOG_FATAL << "This is a FATAL message";

  return 0;

}

由于此代码将成为库的一部分,我不想发出任何日志,直到/除非被使用它的应用程序启用。所以,我想看看,是否可以通过一些宏定义使上面的日志记录代码无效。我尝试了以下方法,但导致编译错误:

#ifdef NO_LOGGING
#undef LOG_VERBOSE 
#define LOG_VERBOSE {}
#undef LOG_DEBUG 
#define LOG_DEBUG {}
#undef LOG_INFO 
#define LOG_INFO {}
#undef LOG_WARNING 
#define LOG_WARNING {}
#undef LOG_ERROR 
#define LOG_ERROR {}
#undef LOG_FATAL 
#define LOG_FATAL {}
#endif

这会导致编译错误

log_test.cpp:25:15: error: expected expression   LOG_VERBOSE << "This is a VERBOSE message" ;
              ^ log_test.cpp:26:13: error: expected expression   LOG_DEBUG << "This is a DEBUG message";
            ^ log_test.cpp:27:12: error: expected expression   LOG_INFO << "This is an INFO message";
           ^ log_test.cpp:28:15: error: expected expression   LOG_WARNING << "This is a WARNING message";
              ^ log_test.cpp:29:13: error: expected expression   LOG_ERROR << "This is an ERROR message";
            ^ log_test.cpp:30:13: error: expected expression   LOG_FATAL << "This is a FATAL message";
            ^

有没有办法解决这个问题并适本地禁用日志?

最佳答案

你最好的选择是做这样的事情:

struct black_hole_t
{
    template <typename T> black_hole_t operator<<(T &&)
    {
        return {};
    }
};

black_hole_t black_hole;

#define LOG_BLAH black_hole

// or #define LOG_BLAH black_hole_t{}
// But GCC generates 1 more instruction for it at -O0,
// which hurts my inner love for premature optimizations.

并希望您的编译器将其优化为空操作。

GCC 7.2 不使用 -O1 对其进行操作,clang 4.0 至少需要 -O2

关于c++ logging - 如何为什么都不做的插入运算符编写条件宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45762421/

相关文章:

foreach 中的 C++ 枚举

c++ - 二维数组

macos - 使用 gfortran 在宏中连接字符串

c++ - SQLite 绑定(bind)参数到通配符

包含用户定义类型指针的 C++ vector

为生成的函数名称定义的 C 预处理器

c++ - "Cleared"宏是否导出为.lib文件?

clojure - 什么时候在 Clojure 宏中使用 ~'some-symbol?

c - 预处理 #(字符串化)运算符和空格

c++ - 用动态内容刷新 wxGrid