Я сам написал небольшую библиотеку 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".Я не знаю, как разобрать мою целевую прогу, поэтому я не могу подтвердить это.
Спасибо!Пожалуйста, прости мой уродливый английский!