web-dev-qa-db-ja.com

ランタイムでcout出力を無効にする方法は?

私はコードのさまざまな場所でcoutをデバッグの目的でよく使用しますが、イライラしてそれらすべてに手動でコメントします。

ランタイムでcout出力を抑制する方法はありますか?

さらに重要なことに、すべてのcout出力を抑制したいとしますが、ターミナルで特定の1つの出力(プログラムの最終出力としましょう)を表示したいとします。

プログラム出力を表示するために端末に「別の方法」で印刷することはできますか?その後、coutを抑制しても、この「別の方法」を使用して印刷されたものをまだ表示できますか?

17
user3639557

coutをデバッグ目的で使用しないでください。ただし、それを呼び出す別のオブジェクト(または関数、マクロ)を定義すると、その関数またはマクロを1か所で無効にできます。

16
RichieHindle

もちろん、( ここの例 ):

int main() {
    std::cout << "First message" << std::endl;

    std::cout.setstate(std::ios_base::failbit);
    std::cout << "Second message" << std::endl;

    std::cout.clear();
    std::cout << "Last message" << std::endl;

    return 0;
}

出力:

First message
Last message

これは、フェイルビットがクリアされるまで、ストリームをfail状態にすると、出力が暗黙的に破棄されるためです。

65
user703016

出力を抑制するには、基になるバッファーをcoutから切断します。

#include <iostream>

using namespace std;

int main(){

    // get underlying buffer
    streambuf* orig_buf = cout.rdbuf();

    // set null
    cout.rdbuf(NULL);

    cout << "this will not be displayed." << endl;

    // restore buffer
    cout.rdbuf(orig_buf);

    cout << "this will be dispalyed." << endl;

    return 0;
}
19
911

cerr-デバッグ目的のエラーの標準出力ストリームを使用できます。

また、clog-ロギング用の標準出力ストリームもあります。

通常、どちらもcoutのように動作します。

例:

cerr << 74 << endl;

詳細: http://www.cplusplus.com/reference/iostream/cerr/

http://www.cplusplus.com/reference/iostream/clog/

4
ivan.mylyanyk

デバッグメッセージを出力しているようです。 Visual C++/MFC内で [〜#〜] trace [〜#〜] を使用するか、それを処理するDebug()関数を作成することができます。個別のフラグが設定されている場合にのみオンにするように実装できます。多くのプログラムは、たとえばverboseまたは-vと呼ばれるコマンドラインパラメータを使用して、ログとデバッグメッセージの動作を制御します。

0
Alex