2013/05/02

ERROR_SUCCESSとNO_ERRORの違い

//
// MessageId: ERROR_SUCCESS
//
// MessageText:
//
// The operation completed successfully.
//
#define ERROR_SUCCESS     0L

#define NO_ERROR          0L      // dderror
#define SEC_E_OK          ((HRESULT)0x00000000L)
なような定義になってる。
さてWindows関数の成否比較に「ERROR_SUCCESS」はエラーなのかサクセスなのか名称から分からないので出来れば使いたくない。
   if (ret == ERROR_SUCCESS) {
      /* これはエラーなの?サクセスなの? */
   }
素直に考えるとその下に定義されている「NO_ERROR」を使いたい。
   if (ret == NO_ERROR) {
      /* ふふん エラーでない場合の処理だね */
   }
では「ERROR_SUCCESS」を「NO_ERROR」に書き換えるのは問題があるか?

現時点で「ERROR_SUCCESS NO_ERROR 使い分け」でGoogle検索をすると8件しか引っ掛からない。誰も同じことを悩んでないのか…?
英語で「ERROR_SUCCESS NO_ERROR difference 」で検索すると 2,830件。
しかしこの疑問に関して説明するものは見当たらなかった。
一応、MSDNのGetAdaptersInfoという関数の説明に、"If the function succeeds, the return value is ERROR_SUCCESS (defined to the same value as NO_ERROR)."という記述があることが分かった。
「ERROR_SUCCESS」というのは絶対におかしい命名だと思うが何故かこちらを使うのが主流らしい。というかAPIのドキュメントにも明確に「成功の場合は『ERROR_SUCCESS』が返る」と書かれている。でも「NO_ERROR」も同じ値であることはほぼ間違いないので、自分のプログラムだけでも「NO_ERROR」で比較するのが良い。
気持ちの問題だけど「NO_ERROR」の方がすごく読み易いので。

「NO_ERROR」はWinAPIのエラーコードだがこれを自作関数の成功値に使うのは良いことか?
なんかいちいち「○○_OK」とか自分で専用の定数を定義するのは面倒だと思うし、「NO_ERROR」なんて汎用的な名称だし、ステータスも明らかなので悪くないと思うが…
やはり自分で成功ステータスも定義するのが普通なのか?
なんかJavaには無い悩みかも。

ちなみに0Lで定義されている定数は他に「S_OK」があるがこれは定義されている場所も用途も少し違うらしい(Com系のリターンコード?)。
(「NO_ERROR」も悪くないけどやっぱり「SUCCESS」が一番しっくりくるよね?)

0 件のコメント:

コメントを投稿