Code Reading

第2章

2.1
echo.c

Javaならgnu.getoptパッケージ

  • strcmpなどの文字列関数を呼び出すときに、実際の文字データのポインタの代わりにNULL値を渡すとプログラムがクラッシュする。よって、&&演算子によってstrcmpにNULL値が渡されるのを防止する。
  • strcmpは文字列が等しい時に値0(C言語における偽)を返す。そこで、STREQというマクロを定義することがよくある。

#define STREQ(a, b) (*(a) == *(b) && stcmp((a), (b)) == 0)

初めの一文字目を比べているのは高速化のため。

  • printf は実際に出力された文字数を返す。putcharは文字の出力に失敗したときEOFを返す。全ての出力関数は、特にプログラムの標準出力をファイルへリダイレクトするとき、出力先に空きスペースがないなどの理由で失敗することがある。よって、出力操作の結果をvoidにキャストするなどして無視することは良くない。いちいちあらゆる出力操作のチェックをするのは面倒なのでJavaならばcheckErrorメソッド、C++ならばストリームのfail,good,badメソッド、Cならばferror関数が使われる。

if (ferror(stdout))
err(1, "stdout");