1

silence modeand print mode(std::cout に出力)で実行できるデーモンがあります。silenceオーバーヘッドと io 呼び出しなしで作成する方法。そうするためのより良い方法を提案してください!または、どのような方法が良いかを書いてください!(メリット・デメリット)

例えば:

1 つの方法:

コードの簡単な場所std::cout << "blah-blah-blah: " << var << std::endl; 沈黙する必要があるとき、close(STDOUT_FILENO)またはcを書き換える必要があるときdev/null(どのように?)

2ウェイ

すべての cout 呼び出しの前に使用global bool FLAG_SILENCEして確認します。if (!FLAG_SILENCE) std::cout << "blah-blah-blah: " << var << std::endl;

#define SILENTCOUT std::cout沈黙が必要な場合の3 通りの 定義済みマクロ#define SILENTCOUT SOMETHING(何か = 演算子<<を持ち、オーバーハードな <<` なし(does not know how to realise, seems need to define our own function with definedで何もしない関数)

4 通りの 定義済みマクロ#define SILENTCOUT(x) std::cout << x << std::endlを使用SILENTCOUT( "mess" )-- 危険、非常に醜い

4

1 に答える 1

2

if一般的な解決策は、と実際の印刷を囲むマクロを提供することです。

#define LOG( msg )                 \
    if ( !log_enabled ) {} else    \
        std::cout << msg;

一般に、マクロはもう少し複雑ですが (たとえば、log_enabledログ レベルをテストする代わりに、定義済みのレベルと比較し、それに応じてログを記録します)。

一部のライブラリは、実装するロガー オブジェクトを返すマクロのオプションを使用operator<<し、構成に応じて、適切なロガーまたは引数を無視するノーオペレーション シンクのいずれかを提供します。これは、少なくとも関数呼び出しでoperator<<.

いずれにせよ、これらの問題はすでに度も解決されているため、ログ ライブラリを使用することをお勧めします。

于 2012-06-09T12:00:17.337 に答える