4

UnixGUIアプリケーションの警告をstd::cerrまたはstd::coutに送信する必要がありますか?

これは、GUIが通常、警告とエラーをコンソールウィンドウに表示し、それらをログファイルに送信することを前提としています。しかし、コンソールが見つからないために使用できない場合は、そのようなメッセージにstd :: cerr、std :: cout、またはstd :: clogを使用する必要がありますか?

私はstd::cerrが彼らが属する場所だと思っています。

4

5 に答える 5

6

私は好きcerrです。cerrユーザーが出力をパイプ処理するかファイルに送信する場合、ユーザーはでオプトアウトできます。

tool 2>/dev/null >output

しかし、すべてを1つのストリームに入れると、SOLのままになります。

またcerr、バッファリングされていないため、クラッシュして燃やしてもエラーメッセージが表示されることが保証されています。そして、ユーザーが上記のものを別のものに置き換えた場合、警告はエラーと一緒にパイプされる必要があり/dev/nullます…それが明確な議論であるかどうかはわかりません。

于 2010-10-05T18:29:54.650 に答える
4

プログラムが、別のプログラムにパイプされる可能性のある、または解析される予定の適切にフォーマットされた出力を持つように設計されている場合は、警告をにリダイレクトすることをお勧めしますstd::cerr

于 2010-10-05T18:30:42.760 に答える
1

コンパイラの場合、コンパイル中のコードに関するエラーメッセージは「通常の」出力であるため、stderrではなくstdoutに書き込む必要があります。stderrに書き込む必要のあるメッセージは、コンパイラ自体の実行エラーに関するものだけです(たとえば、コンパイラの一部を構成するファイルが見つからないため、コンパイラを実行できなかった場合)。

同じ基本的なガイドラインが他のほとんどのプログラムにも当てはまります。問題の「メッセージ」がそのプログラムの「標準」出力の一部であり、ユーザーが出力をリダイレクトするときに含まれることを通常期待する場合は、標準出力に書き込まれます。標準エラーは、標準出力がファイルにリダイレクトされている場合でも、ユーザーが通常見たい/必要とするメッセージを対象としています。主に、プログラムを実行できなかったために出力がない、または出力がないというメッセージです。不完全または無効である可能性があります。

于 2010-10-05T18:34:32.813 に答える
0

Windowsでは、std::cerrもstd::coutもGUIプログラムのどこにも向けられておらず、空の大きなビットバケットに移動するだけです。ただし、*nixベースのシステムについて話していると思います。

于 2010-10-05T19:16:37.960 に答える
0

これはOPに役立つ可能性があります。これが私たちが行うことです:

  1. stderrをローカルログファイルにリダイレクトします(1つのプロセスごとに1つのログファイル)
  2. 独自のsyslog()クライアント(C ++フロント)(およびローカルの「SyslogWatcher」サーバー)を使用する
  3. すべてのメッセージを使用するopenlog()と、ローカルログファイルにも送信されますLOG_PERRORsyslog
  4. 全く使用iostreamsしていません
  5. コンソールは、独自の小さなテストフレームワークにのみ使用します

正解です。これは*nixではありません。私たちの弁護には、WIN32でもありません。UIアプリは行っておりません。

于 2019-03-23T14:19:24.633 に答える