2015-09-24 25 views
8

私が知る限り、ストリームエラーを処理する2つのオプションはperrorとストリーム例外です。両方のオプションは望ましくありません。perrorのC++に相当しますか?

  • std::strerror

    PERROR実装定義のメッセージを返します。ここに理由です。このメッセージは、すべてのシステム

  • std::strerrorに常に有用ではありませんstd::strerrorによって返されたポインタはCライブラリは技術的にC++で「非推奨」され

  • を無効にすることができますスレッドセーフ

  • ではありません。ほぼ常にC++のishと同等です。私は潜在的なC++

    • 例外は、すべてのプログラム

    • しばらくの間、適切ではありません同等

    ストリームの例外があるときPOSIXやCに依存しなければならない理由はありませんstd::strerrorは有用なエラーメッセージを出力することがありますが、ストリーム例外は決してになると便利なエラーメッセージが表示されます。 f.exceptions(f.failbit)を指定すると、ファイルのオープンに失敗した場合、または抽出に失敗した場合は、スローされた例外はstd::ios_base::failurewhat()は "basic_ios::clear"となります。 std::system_errorstd::ios_base::failureの交換

SYSTEM_ERROR

はまったく同じ結果が得られます。

ios_base::failure例外を投げ、実装が失敗の具体的な理由 を識別ecの値を提供することを奨励 をしている:私たちはN2769: Detailed Reporting for Input/Output Library Errors (Revision 2)で見てみるならば、なぜ、私たちは見ることができます。 【 - オペレーティング 系から生じるエラーは通常、オペレーティングシステムによって報告されたエラー番号の エラー値とsystem_categoryエラーとして報告されます。ストリーム・ライブラリ内から生じる エラー典型的error_code(ioerrc::stream, iostream_categoryとして報告 あろう) - 端 音符]。

上記の文言は、正しいことを行うための実装のための唯一の規範的な励ましを提供し、ひいては ユーザーに有用な結果を生成するために市場の力 や実装の良い内包に依存しています。より強いもの(例えば、 "に変更する"など)は多くの追加仕様を必要とし、 の範囲を超え、LWGが現実的にC++ 0xに対応できる範囲を超えています。

代替あなたは何をやっている知っている限り、潜在的にかさばるサードパーティのライブラリに依存している(私はブーストあなたの探しています)、あるいは、あなたがやりたいことはありませんそれ(ロールを手にしています)私はこれを行うにはC + +の標準ライブラリの方法を探しています。何かありますか?

+0

['std :: system_error'](http://en.cppreference.com/w/cpp/error/system_error) –

+1

@πάνταῥεlookを参照してください。その理由を説明しましたどちらもうまくいかないでしょう。 – user5371056

+0

POSIXには、 'strerror_r()'があります。 – Davislor

答えて

0

POSIXにはstrerror_r()があり、Windowsにはstrerror_s()があります。そこにはstrerror_r()といういくつかの互換性のない関数がありますので、機能テストマクロを使用してください。

1

私はperrorはらアリイ

であなたに同意しない(*)C標準ライブラリのメンバーであり、そのように技術的には非推奨。公式ドキュメントのソースでない場合

はまあでもcplusplus.comに、私はエラー番号を参照:

C++ 11は、このヘッダで定義するのに必要な値の基本セットを拡張し... C++では、errnoは常にマクロとして宣言されますが、Cでは、外部リンケージを持つintオブジェクトとして実装されることもあります。これらの文章の

私の理解では、errnoがまだC++ 11で考慮されていることです!各スレッドは、独自のローカルのerrnoを有する:

私も、スレッドごとにエラー番号を実施しなければならないマルチスレッドをサポートして後で

ライブラリを見ることができます。これは、C11およびC++ 11標準に準拠したライブラリの要件です。

それはstrerror()は、スレッドセーフでない場合でも、errnoは任意のC++ 11準拠の実装であることを意味しています。

std::strerrorを同期関数(たとえば、mutexで保護されている)に使用して、std::stringを作成することができます。しかし、とにかく、strerrorのすべてのドキュメントが上書きすることができる静的バッファを使用していると述べても(Posix 1がstrerror_rを定義する理由です)、perrorではスレッドセーフではないという警告は見つかりませんでした。

(*)は、その上のマイ意見はOOとテンプレートがよりよいインターフェイス(string.hの対stdio.hのか、文字列対のiostream)を得ることができたときに、Cライブラリの要素は、他の人がを置き換えていることですC++ライブラリで。しかし、追加するものがない場合(cerrno、cmath、csignalなど)、C標準ライブラリの関数は単にC++の関数に含まれています。

関連する問題