25

私の質問:POSIXとWindowsの値std::error_codeからインスタンスを構築して、インスタンスをからの既知の値と比較できるようにする正しい方法は何ですか?errnoGetLastError()std::errc

より長い説明:私の目標は、std::error_codePOSIXおよびWindowsシステムでC++11のように機能する自作の例外オブジェクトにインスタンスを追加することです。

私のクロスプラットフォームアプリケーションでは、ファイルを開く/作成するためにPOSIXfopen()とWindowsの呼び出しを使用する自作のI/Oクラス階層を使用しています。CreateFile()それが失敗した場合、一般的な自作のopen_error例外がスローされます(これは、はいから派生していstd::exceptionますが、C ++の事前定義された例外クラスの1つではありません)。私はこのやや最低限の例外をエラーコードで拡張しようとしています。std::error_code私が正しく理解していれば、C++11でより正確になります。

私の問題は、errno(POSIXの場合)またはGetLastError()(Windowsの場合)からそのようなオブジェクトを構築する方法です。POSIXの場合、私が理解している限り、のコンストラクターで単純に使用できます。たとえば、次のようにerrnoなります。std::error_code

std::error_code ec(errno, std::generic_category());

そして、それecはからのよく知られた値に匹敵するはずですstd::errc

もちろん、Windowsの場合も同様の呼び出しを行うことができます。

std::error_code ec(::GetLastError(), std::generic_category());

GetLastError()しかし、によって返される値がからのよく知られた定数にうまくマップされているかどうかはわかりませんstd::errcBoostのシステムライブラリでBoostの実装についてerror_code読んだことがありますが、Boostの実装ではなく、実装について質問していstdます。

ファイルアクセスにC++ストリームの使用に切り替えることはお勧めしません。やりたいのですが、コードの半分をリファクタリングすることは、現時点でやりたいことではありません。

4

3 に答える 3

10

それは実装の品質の問題です。によって返される const 静的オブジェクトはstd::system_category()、プラットフォーム固有のエラー コード列挙から標準std::error_condition列挙へのマッピングを実行するために使用されます。17.6.5.14 の下エラーコードの値 [value.error.codes] :

POSIX に基づいていないオペレーティング システムの実装では、オペレーティング システムの値と同じ値を定義することが推奨されます。

Boost がどのようにマッピングを実行するかは、 http: //www.boost.org/doc/libs/1_46_1/libs/system/src/error_code.cppで確認できます。Windows で使用するためにコンパイラ ベンダーが提供する標準ライブラリは、同様のことを行う必要があります。

意図された動作は 19.5.1.5p4 でカバーされており、次のように説明されていsystem_category().default_error_condition(int ev)ます。

引数evが POSIX errno 値に対応する場合posv、関数は戻りerror_condition(posv, generic_category())ます。それ以外の場合、関数は を返しerror_condition(ev, system_category())ます。

したがって、たとえば、error_code(ERROR_FILE_NOT_FOUND, std::system_category()).default_error_condition()を呼び出すstd::system_category().default_error_condition(ERROR_FILE_NOT_FOUND)と、 が返されstd::error_condition(std::no_such_file_or_directory, std::generic_category())ます。

于 2012-12-19T11:21:54.003 に答える