如何绕过<

问题描述 投票:0回答:1

我为自己编写了一个小的日志记录库,它接受两种形式的调用。

一个人喜欢普通的函数调用,另一个人喜欢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仍然会产生调用二进制代码的函数。我不知道如何拆卸目标编,所以无法确认。

感谢!请原谅我难看的英语!

c++ macros iostream ostream conditional-compilation
1个回答
2
投票

为什么不将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{}
© www.soinside.com 2019 - 2024. All rights reserved.