UnixGUIアプリケーションの警告をstd::cerrまたはstd::coutに送信する必要がありますか?
これは、GUIが通常、警告とエラーをコンソールウィンドウに表示し、それらをログファイルに送信することを前提としています。しかし、コンソールが見つからないために使用できない場合は、そのようなメッセージにstd :: cerr、std :: cout、またはstd :: clogを使用する必要がありますか?
私はstd::cerrが彼らが属する場所だと思っています。
私は好きcerr
です。cerr
ユーザーが出力をパイプ処理するかファイルに送信する場合、ユーザーはでオプトアウトできます。
tool 2>/dev/null >output
しかし、すべてを1つのストリームに入れると、SOLのままになります。
またcerr
、バッファリングされていないため、クラッシュして燃やしてもエラーメッセージが表示されることが保証されています。そして、ユーザーが上記のものを別のものに置き換えた場合、警告はエラーと一緒にパイプされる必要があり/dev/null
ます…それが明確な議論であるかどうかはわかりません。
プログラムが、別のプログラムにパイプされる可能性のある、または解析される予定の適切にフォーマットされた出力を持つように設計されている場合は、警告をにリダイレクトすることをお勧めしますstd::cerr
。
コンパイラの場合、コンパイル中のコードに関するエラーメッセージは「通常の」出力であるため、stderrではなくstdoutに書き込む必要があります。stderrに書き込む必要のあるメッセージは、コンパイラ自体の実行エラーに関するものだけです(たとえば、コンパイラの一部を構成するファイルが見つからないため、コンパイラを実行できなかった場合)。
同じ基本的なガイドラインが他のほとんどのプログラムにも当てはまります。問題の「メッセージ」がそのプログラムの「標準」出力の一部であり、ユーザーが出力をリダイレクトするときに含まれることを通常期待する場合は、標準出力に書き込まれます。標準エラーは、標準出力がファイルにリダイレクトされている場合でも、ユーザーが通常見たい/必要とするメッセージを対象としています。主に、プログラムを実行できなかったために出力がない、または出力がないというメッセージです。不完全または無効である可能性があります。
Windowsでは、std::cerrもstd::coutもGUIプログラムのどこにも向けられておらず、空の大きなビットバケットに移動するだけです。ただし、*nixベースのシステムについて話していると思います。
これはOPに役立つ可能性があります。これが私たちが行うことです:
syslog()
クライアント(C ++フロント)(およびローカルの「SyslogWatcher」サーバー)を使用するopenlog()
と、ローカルログファイルにも送信されますLOG_PERROR
syslog
iostreams
していません正解です。これは*nixではありません。私たちの弁護には、WIN32でもありません。UIアプリは行っておりません。