5

boost::logC++ プログラムのロガーとして使用しています。開発中は、次のようによく使用します。

#define LOG(severity) BOOST_LOG_SEV(boost::logger::get(), (severity))
#define LOG_ERR LOG(Severity::error)
#define LOG_INFO LOG(Severity::info)
#define LOG_DEBUG LOG(Severity::debug)

BOOST_LOG_SEVは によって提供される機能でboost::logありLOGLOG_ERRORLOG_INFOLOG_DEBUGは私が定義したショートカットです。

つまりBOOST_LOG_SEV、現在のデバッグの重大度とマクロ自体に渡された重大度を動的に比較して、出力を発行するかどうかを決定します。

これは、デバッグ目的で上記のマクロを使用するプログラムの例です。

// set at compile time
#define MAX_LOG_SEVERITY Severity::debug

int main() {
   // Print all the messages with a
   // Severity <= MAX_LOG_SEVERITY defined before compiling
   boost::log::set_severity(boost::logger::get(), MAX_LOG_SEVERITY); // set_severity() is fictitious just to give you an idea

   // bool err = ...
   if (err)
      LOG_ERR << "An error occurred";
   else 
      LOG_INFO << "Okay;
   LOG_DEBUG << "main() called";
}

現在、実稼働環境用にプログラムをリリースする場合、Severity::debugレベル付きのデバッグ メッセージはあまり意味がありません。に減らすだけでそれらを出力から隠すことができますMAX_LOG_SEVERITYSeverity::info、問題は、によって行われた呼び出しがLOG_DEBUG実行可能コードから削除されないことです。これは、効率とオブジェクト サイズの両方に悪影響を及ぼします。

コードはロギング ステートメントでいっぱいです。単純なoperator<<().

LOG_DEBUGこれらのステートメント自体に触れずに、プリプロセッサまたはコンパイラ (最適化中に)が定数MAX_LOG_SEVERITYに設定されているときにデバッグステートメントを「スキップ」または「削除」するためのより良いマクロ定義/トリックはありますか?Severity::debug

4

4 に答える 4

2

@MartinShobeの受け入れられた回答は以下で機能します:

  • g++ (4.7.2)-O1以降
  • clang++ (3.4)-O2以降
  • リンカー フラグを使用した Visual Studio (2008)/OPT:REF
于 2014-05-29T02:22:25.863 に答える
0

受け入れられた答えは私にはうまくいきません(MSVC 2019、stdc++17)。

ただし、私の解決策は少し奇抜です。しかし、最適化は間違いなくそれを処理する必要があります:

#ifdef NDEBUG
#define LOG_DEBUG if (false) std::cout
#そうしないと
#define LOG_DEBUG if (true) std::cout
#endif

使用法:

LOG_DEBUG << ... << std::endl;
于 2021-03-29T13:30:37.690 に答える
-2

プログラム内のすべての最適化を無効にし、コンパイルを高速化します。

/Od または boot_log_stop

于 2013-04-16T03:04:05.727 に答える