c logging – 如何为不执行任何操作的插入操作符编写条件宏
发布时间:2020-12-16 10:07:36 所属栏目:百科 来源:网络整理
导读:我有一段使用 plog进行日志记录的代码,如下所示: int main(int argc,char** argv) { static plog::ColorConsoleAppenderplog::TxtFormatter consoleAppender; plog::init(plog::verbose,consoleAppender); // Log severity levels are printed in different
我有一段使用
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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |