我为自己编写了一个小的日志记录库,它接受两种形式的调用。
一个人喜欢普通的函数调用,另一个人喜欢std :: ostream <
#ifdef DEBUG
#define LOG_DEBUG( strLogBody ) appendLog( leon_log::LogLevel_e::ellDebug, std::string( __func__ ) + "()," + ( strLogBody ) )
#define LOG_INFOR( strLogBody ) appendLog( leon_log::LogLevel_e::ellInfor, std::string( __func__ ) + "()," + ( strLogBody ) )
#define log_debug ( Logger_t( LogLevel_e::ellDebug ) << __func__ << "()," )
#define log_infor ( Logger_t( LogLevel_e::ellInfor ) << __func__ << "()," )
//...more for other log-levels
#else
#define LOG_DEBUG( strLogBody )
#define LOG_INFOR( strLogBody ) appendLog( leon_log::LogLevel_e::ellInfor, ( strLogBody ) )
#define log_debug ( Logger_t( LogLevel_e::ellDebug ) )
#define log_infor ( Logger_t( LogLevel_e::ellInfor ) )
//...more for other log-levels
#endif
[当在客户代码空间中定义了一个“ DEBUG”宏时,两者都形成了用于DEBUGGING目的的产品目标代码。当未定义“ DEBUG”宏时,前一种形式(如函数调用)不会产生任何二进制代码来加快我的应用程序的速度(如我所愿),而后一种形式无论如何都会产生产品代码。
有没有办法像处理那些普通函数一样绕过那些“ <
到目前为止,我正在使用一种类似于给定的@Botje的解决方案。所不同的只是,我的是Logger_t的朋友函数,而Botje的是成员函数。跟随的是我的:
template <typename T>
inline Logger_t& operator<<( Logger_t& lgr, const T& body ) {
if ( lgr.m_LogLevel >= g_ellLogLevel )
dynamic_cast<std::ostringstream&>( lgr ) << body;
return lgr;
};
但是我想,即使所有这些都是“ no-op”调用,GCC仍然会产生调用二进制代码的函数。我不知道如何拆卸目标编,所以无法确认。
感谢!请原谅我难看的英语!
为什么不将operator<<
设置为非调试版本中的无操作项:
#ifndef DEBUG
struct Logger_t {
template <class T>
Logger_t& operator <<(const T& o) { return *this; }
};
#endif
编译器应该能够将整个log_debug << ... << ...
链减少为零。
[如果还要避免在<operator bool和Logger_t
定义为>]
#define log_debug false && Logger_t{}