66992


関数の戻り値などで、正常/異常を返したりします。  
その際、用いられる値の定義でよく『ERR_OK』『E_OK』のような表現を見ます。  
この『ERR』や『E』は『Error』だと思うのですが、何に起因するものなのでしょうか？

・わざわざ『ERR』や『E』を付ける理由は？『OK』だけではダメな理由は？  
・Errorコード定義の集合として分かるようにしているだけ？  
・そもそも『Error』では無い？  
辺りが気になります。

今まで『まぁ、そういうルールか。』でやっていましたが、久しぶりに遭遇したので質問します。  
ご存知の方居られましたら、ご教示ください。


CC BY-SA 4.0
2020-05-26T01:44:17.493
66989
2020-05-26T03:19:38.597
2020-05-26T03:19:38.597
19110
2383
question
命名規則
ERR_OKのような表現は何に起因するものでしょうか？


よくある UNIX 系カーネルソースやツールソース、すなわち [c](/questions/tagged/c "'c' のタグが付いた質問を表示")
の話として

初期の [c](/questions/tagged/c "'c' のタグが付いた質問を表示") いわゆる ANSI-C より古いものにおいて `enum`
はありませんでした。よってエラーコード一覧のようなものに英単語列を与えるには `#define` しか手はありません。よく知られている通り
`#define` はソースコードテキストレベルでの置換で、濫用はご法度です。特に、短い名前を使うのは論外。

[code]

    #define OK 0 /* alice.h */
    #define OK 1 /* bob.h */ /* redeclaration */
    /* I am charlie, how I can use BOTH `OK` ? */
    
[/code]

`enum` は [c89](/questions/tagged/c89 "'c89' のタグが付いた質問を表示")
で付け加えられたものですが、テキスト置換こそしないまでも、複数の `enum` に同じ名前を与えることはできません。

[code]

    enum resultA { OK=0, ERR=1 };
    enum resultB { OK=1, ERR=-1 }; // redeclaration
    
[/code]

よって [c](/questions/tagged/c "'c' のタグが付いた質問を表示") においては [関連性のある複数の名前に]
(まあ要するにエラーコード一覧とか) prefix ないし suffix
をつけない短い名前を使うと混乱の元です。ないしは作者の違うソースが共存不可能になってしまいます。よってしかたなく prefix / suffix
を使うしかなかったってのが実情でしょう。んで `grep` しやすいのは prefix のほうだから

  * エラーコードなら `E_` prefix をつけてみた（ライブラリ作者がそうした）
  * 既に `E_` prefix が使われちゃっているから仕方なく `ERR_` prefix にしてみた（ライブラリユーザーは）
  * 結果コードなら `RESULT_` prefix をつけてみた
  * 設定値なら `CONF_` prefix をつけてみた

つまり実装上の都合に過ぎず、海より深い理由は無いとオイラ個人は思っています。

[c#](/questions/tagged/c%23 "'c#' のタグが付いた質問を表示") では
`CallingConvention.StdCall` のように `enum` 名を併記しないといけないようになりましたよね（古くからの
[c](/questions/tagged/c "'c' のタグが付いた質問を表示")
ユーザには「名前が長すぎ」と不評ですが、こちらのほうが絶対にわかりやすくて安全です）


CC BY-SA 4.0
2020-05-26T02:45:46.680
66992
2020-05-26T02:45:46.680
8589
66989
answer