2011-09-25 5 views
5

C++ 0xには、error_categoryのオブジェクトが2つあります(generic_category()およびsystem_category())。私が今まで理解しているところでは、オペレーティングシステムから返されたエラーにはsystem_category()を使用し、に対応するstd::errcにある一般的な値にはgeneric_category()を使用する必要があります。Unixでは、errnoにsystem_categoryまたはgeneric_categoryを使用する必要がありますか?

しかし、errnoの値の場合は、オペレーティングシステムによってエラーが返されます。 system_category()(非UNIX系のシステムでは、#ifdefが必要)や、generic_category()(標準でないerrnoのUnixライクなシステムでは間違っている)を使うべきでしょうか?

+0

回答を読み終えたら、私はまだ何を使用するのか不明です。 – robert

答えて

1

あなたが実際にオペレーティングシステムでない場合(またはOS固有の機能からエラーを報告していない場合)は、system_categoryを使用しないでください。カテゴリには、エラーの発生元が記載されています。必ずしもエラーコードが意味するものではありません。したがって、system_categoryの可能なエラーコードのセットをgeneric_categoryと同じにすることは完全に正当です。

+1

私はそれを得るかどうかを見てみましょう:私は 'system_category()'を使うべきです。なぜなら、私が持っている 'errno'の値は、オペレーティングシステムの関数か、オペレーティングシステムの関数を呼び出した関数か、 ...と呼ばれる関数と呼ばれる)。しかし、 'system_category()'は 'GetLastError()'の値であり、Cライブラリ関数は 'errno'のエラーを報告するので、Win32で何をすべきでしょうか? – CesarB

+0

@CesarB - ニコル・ボラスが書いたのとまったく同じように聞こえる。 :)あなたが呼び出した関数によってerrnoがすでに設定されている場合、なぜそれを使いこなすのですか?しかし、あなたがそれを混乱させる必要があるなら、Nicolは 'generic_category'を使用するようにアドバイスしています。 – Marc

+0

@Marc:私はerrno(例えば 'epoll_ctl'や' open')を設定する関数を呼び出していますが、エラーの場合には 'system_error'(errnoをラップする)を投げたいと思います。 – CesarB

1

C++標準ライブラリ関数がそうであるようにあなたがsystem_category()を使用してOS(UNIXなどPOSIXベースのOSを含むいずれか)からエラーを報告することを意図している - 以下のC++ 11標準からの引用を参照してください。

17.6.5.14エラーコードの値[value.error.codes]

1 std :: error_code(19.5.2.1)オブジェクトを介してエラーを報告するC++標準ライブラリの関数があります。 その オブジェクトのcategory()メンバは、操作 システムから発生したエラーに対してstd :: system_category()を返します。または、他の場所でエラー を起点とする実装定義のerror_categoryオブジェクトへの参照を返します。実装は、これらのエラーカテゴリのそれぞれについてvalue()の可能な値を定義しなければならない。 [例:POSIXに基づくオペレーティングシステムでは、 のstd :: system_category()値をPOSIXのerrno値と同じ値として定義し、オペレーティングシステムのマニュアルでは という追加の値を定義することをお勧めします。 POSIX上の に基づいていないオペレーティングシステムの実装では、オペレーティングシステムの値と同じ値を定義することをお勧めします。 がオペレーティングシステムから発生しないエラーの場合、実装は関連付けられた値の列挙を提供する可能性があります。 -end example]

+0

"OSから"うまく聞こえるほど明確ではありません。 'errno'はUnix上のlibc(OSの一部です)から来ています。 Windowsでは、 'errno'は必ずしもOSの一部ではないCランタイムからのものです。とにかく、Windowsでは 'errno'に' system_category'を使用することはできません。なぜなら、これはネイティブウィンドウエラーのために予約されていなければならないからです。しかし、 'fopen'を行うと、どちらの場合でも' errno'を同じように扱いたいと思います。 – ysdx

関連する問題