如何通过预处理器宏让C++中<<风格单行日志成为空操作?
C++ 实现<<风格日志的编译期开关
你可以通过定义空操作流对象结合预处理器宏来实现需求,不用在代码里写大量#ifdef,同时保持单行日志语句的可读性,编译期就能完全移除关闭状态下的日志代码。
实现步骤:
- 先定义一个什么都不做的空流结构体,重载
<<操作符但不执行任何实际逻辑:
#include <ostream> struct NullStream { // 处理普通数据类型 template<typename T> NullStream& operator<<(const T&) { return *this; } // 处理std::endl这类操纵符(可选,按需添加) NullStream& operator<<(std::ostream& (*)(std::ostream&)) { return *this; } };
- 用预处理器宏根据
DEBUG开关切换日志对象:
#ifdef DEBUG #define DEBUG_LOG std::cout #else #define DEBUG_LOG NullStream() #endif
- 日常使用时直接调用宏,写法和原生
cout完全一致:
// DEBUG开启时正常输出,关闭时编译成空操作 DEBUG_LOG << "Some important logging:" << foo << bar; DEBUG_LOG << "带换行的日志" << std::endl;
原理说明:
- 当
DEBUG未定义时,DEBUG_LOG会实例化一个NullStream对象,所有<<操作都会调用空实现,编译器优化阶段会完全移除这些无意义的代码,不会产生任何运行时开销。 - 这种写法保持了代码整洁,不用给每一行日志加
#ifdef包裹,缩进和可读性不受影响。
内容的提问来源于stack exchange,提问作者Bri Bri
相关产品推荐
相关产品推荐

