質問: 関数の戻り値などで、正常/異常を返したりします。 その際、用いられる値の定義でよく『ERR_OK』『E_OK』のような表現を見ます。 この『ERR』や『E』は『Error』だと思うのですが、何に起因するものなのでしょうか? ・わざわざ『ERR』や『E』を付ける理由は?『OK』だけではダメな理由は? ・Errorコード定義の集合として分かるようにしているだけ? ・そもそも『Error』では無い? 辺りが気になります。 今まで『まぁ、そういうルールか。』でやっていましたが、久しぶりに遭遇したので質問します。 ご存知の方居られましたら、ご教示ください。
回答: よくある UNIX 系カーネルソースやツールソース、すなわち [c](/questions/tagged/c "'c' のタグが付いた質問を表示") の話として 初期の [c](/questions/tagged/c "'c' のタグが付いた質問を表示") いわゆる ANSI-C より古いものにおいて `enum` はありませんでした。よってエラーコード一覧のようなものに英単語列を与えるには `#define` しか手はありません。よく知られている通り `#define` はソースコードテキストレベルでの置換で、濫用はご法度です。特に、短い名前を使うのは論外。 ``` #define OK 0 /* alice.h */ #define OK 1 /* bob.h */ /* redeclaration */ /* I am charlie, how I can use BOTH `OK` ? */ ``` `enum` は [c89](/questions/tagged/c89 "'c89' のタグが付いた質問を表示") で付け加えられたものですが、テキスト置換こそしないまでも、複数の `enum` に同じ名前を与えることはできません。 ``` enum resultA { OK=0, ERR=1 }; enum resultB { OK=1, ERR=-1 }; // redeclaration ``` よって [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' のタグが付いた質問を表示") ユーザには「名前が長すぎ」と不評ですが、こちらのほうが絶対にわかりやすくて安全です)