10

私は自分のリターンタイプと関数を次のように定義しています:

typedef enum xx_return_t {
   success = 0,
   general_error = -1,
   specific_error = -2,
   [...]
} xx_return_type;

xx_return_type generalFunction(void) {
   if(there_was_an_error)
      return general_error;
}

ただし、ここでのエラータイプの値については少しわかりません。 C / C ++でのエラーリターンの値の標準/ベストプラクティスは何ですか?負または正ですか?

更新: ご回答ありがとうございます!CとC++の両方に関する情報を探していましたが、これにより、各言語に固有の一般的な構造とメソッド(例外、エラーコード、オブジェクトの戻り値など)についての良い質問が生じることもわかりました。

4

5 に答える 5

17

これは、実際には1つに偽装された2つのまったく異なる質問(CバージョンとC ++バージョン)です。

C ++では、答えは簡単です。返されたデータ値には戻り値を使用し、エラー/例外の場合には例外を使用します。純粋なC++でのエラーチェックに戻り値を使用しないでください(CライブラリAPIからC ++は別の話です)。

Cにはそのオプションがないため、成功には0を使用し、エラーコードには負の数を使用することをお勧めします。readこれにより、必要に応じて、追加の成功情報(呼び出しなど)に正の数を使用できる柔軟性が残ります。

于 2012-10-04T13:40:12.717 に答える
4

C ++:

  1. それは選択の問題です、私は両方を見ました。
  2. 例外を使用してください!
于 2012-10-04T13:17:02.887 に答える
3

選択できる規則がいくつかあります。

  • マイクロソフトは、ほとんどの高レベルAPIに0 = FALSE=errorを使用しています。そして、ユーザーがグローバル関数を使用して特定のエラーを検索できるようにしますGetLastError()
  • マイクロソフトは、レジストリ、オーディオ、テレフォニーなどの低レベルのAPIに0=okを使用します。HRESULTこれらはすべて、特定のエラーコードを含む、に似たタイプを返します。
  • ステータスを返すposix関数は通常、エラーに対して-1を返し、ユーザーがグローバル変数を介してエラーを検索できるようにします。errno
  • ポインタを返す関数は通常、エラーに対してNULLを返します
  • c ++ STL関数は、「見つかりません」などのステータスに対して「終了」を返します。'out-of-memory'のようなエラーは、例外を使用して通知されます。

一般に、どの規則を使用するかよりも、規則を一貫して使用することが重要です。

ところで、これを行わない方法のいくつかの例は、Microsoftのヘッダーファイルにあります。

#define S_OK       ((HRESULT)0x00000000L)
#define S_FALSE    ((HRESULT)0x00000001L)

また、ウィンドウ内のの2つの異なるエラー値に注意してくださいHANDLE:0またはINVALID_HANDLE_VALUE

于 2012-10-04T13:30:04.440 に答える
2

私はCについて知りません...

...しかし、C ++では、一般的にエラーコードを使用しないという考え方です。

例外を使用する必要があるという意味ではありませんが、エラーコードはあまり有益ではありません(コンテキストが不足しているためFILE_NOT_FOUND、ファイル名が不明な場合の価値は何ですか?)。

例外を使用しなかった場合、本格的なエラーオブジェクトを好む傾向がありました。例は次のとおりです。

boost::variant<File, Error> open(std::string const& filename, FileMode mode);

何が起こっているかに応じて、ファイルまたはエラーのいずれかが表示されます。

于 2012-10-04T13:21:05.987 に答える
1

ブール値と見なすことができるように、0(ゼロ)とゼロ以外を使用することをお勧めします。通常、falseは0であり、trueはそれ以外の場合です。

于 2012-10-04T13:16:49.903 に答える