私はコードのさまざまな場所でcout
をデバッグの目的でよく使用しますが、イライラしてそれらすべてに手動でコメントします。
ランタイムでcout出力を抑制する方法はありますか?
さらに重要なことに、すべてのcout
出力を抑制したいとしますが、ターミナルで特定の1つの出力(プログラムの最終出力としましょう)を表示したいとします。
プログラム出力を表示するために端末に「別の方法」で印刷することはできますか?その後、coutを抑制しても、この「別の方法」を使用して印刷されたものをまだ表示できますか?
cout
をデバッグ目的で使用しないでください。ただし、それを呼び出す別のオブジェクト(または関数、マクロ)を定義すると、その関数またはマクロを1か所で無効にできます。
もちろん、( ここの例 ):
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
状態にすると、出力が暗黙的に破棄されるためです。
出力を抑制するには、基になるバッファーを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;
}
cerr
-デバッグ目的のエラーの標準出力ストリームを使用できます。
また、clog
-ロギング用の標準出力ストリームもあります。
通常、どちらもcout
のように動作します。
例:
cerr << 74 << endl;
デバッグメッセージを出力しているようです。 Visual C++/MFC内で [〜#〜] trace [〜#〜] を使用するか、それを処理するDebug()
関数を作成することができます。個別のフラグが設定されている場合にのみオンにするように実装できます。多くのプログラムは、たとえばverbose
または-v
と呼ばれるコマンドラインパラメータを使用して、ログとデバッグメッセージの動作を制御します。