Как обойти << вызов, как если бы макрос "#ifndef DEBUG" в C ++? - PullRequest
0 голосов
/ 27 сентября 2019

Я сам написал небольшую библиотеку logging-lib, и она принимает вызов двух форм.

Один любит обычный вызов функции, другой любит вывод оператора std :: ostream <<.И затем я определил несколько макросов соответственно для каждого уровня журнала следующим образом: </p>

#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», оба формируют целевые коды продукта для отладки.,Когда макрос «DEBUG» не определен, первая форма (например, вызов функции) не создает двоичных кодов для ускорения работы моего приложения (как я хочу), тогда как вторая форма в любом случае кодирует продукты.

Есть ли способ, которым я могу обойти эти вызовы "<<" так же, как и с этими обычными вызовами функций? </p>

Пока что я использую решение, аналогичное приведенному @Botje.Разница лишь в том, что шахты - это друг-друг в Logger_t, а Ботье - это член-функция.Вот мое:

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;
};

Но я предполагаю, что GCC все еще производит функцию, вызывающую двоичные коды, даже если это все вызовы "no-op".Я не знаю, как разобрать мою целевую прогу, поэтому я не могу подтвердить это.

Спасибо!Пожалуйста, прости мой уродливый английский!

1 Ответ

2 голосов
/ 27 сентября 2019

Почему бы не сделать operator<< запретом в сборках без отладки:

#ifndef DEBUG
struct Logger_t {
  template <class T>
  Logger_t& operator <<(const T& o) { return *this; }
};
#endif

Компилятор должен иметь возможность уменьшить всю цепочку log_debug << ... << ... до нуля.

Если вы также хотите избежать вызовов функций в цепочке <<, определите <code>operator bool для Logger_t и

#define log_debug false && Logger_t{}
...