namazu-dev(ring)


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

use strerror()



GNUコーディングスタンダードの日本語訳
<http://duff.kuicr.kyoto-u.ac.jp/~okuji/gnujdoc.html> を読み
ました。

で、次の文を読んでさっそく strerror(errno) を使うように徹底
しました。:-)

| エラーを無視したいと思っているのでなければ、あらゆるシステム
| コールのエラーを確認しなさい。失敗したシステムコールから発生
| するあらゆる エラーメッセージに、もしあればファイルの名前と
| そのユーティリティの名前 だけでなく、(perrorや同等のものから
| 得られる)システムエラー文字 列を含めなさい。単なる"cannot
| open foo.c"や"stat failed"は十分でな い。

fopen や malloc の直後では必ず strerror(errno) でエラーメッ
セージを取得します。

エラーメッセージの出力には次の関数を用います。どの関数も
printf() と同じ書式を受けつけます。

  * nmz_warn_printf():  warning用 (単なる警告)
  * nmz_debug_printf(): debug用 (開発者向け)
  * nmz_die():          すぐさま終了する (libnmz の中では使わない)
  * set_dyingmsg():     libnmz内で起きたエラーの内容を記録する
    - エラーが起きた関数の名前も記録している (debug向け)

   ...

ところで、 assert() の変種として次のマクロを作りました。
rcfile.c の中で使っています。いかがなものでしょう?

  #define MUST_NOT_BE_REACHED_HERE() \
    {\
        fprintf(stderr, "%s: %s:%d: MUST NOT BE REACHED HERE! Report bug!\n",\
                PACKAGE, __FILE__, __LINE__);\
        abort();\
    }

こんな感じに使います。

   if (foo) {
       do something;
   } else if (bar) {
       do something;
   } else if (baz) {
       do something;
   } else {
       MUST_NOT_BE_REACHED_HERE(); // ここには絶対に来ないはず
   }

万が一、 MUST_NOT_BE_REACHED_HERE() にたどり着くと、

  foobar: foobar.c:342: MUST NOT BE REACHED HERE! Report bug!
  zsh: 30148 abort (core dumped) foobar

となります。

# こういうことをしているプログラムはどのくらいあるのだろう?

-- Satoru Takabayashi