Namazu-devel-ja(旧)


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

余談 fputc(), putc()



竹迫です。

ちょっと余談になってしまいますが、、、

On Tue, 27 Nov 2001 17:49:53 JST
knok@xxxxxxxxxxxxx (NOKUBI Takatsugu) wrote:
> <200111270834.fAR8YCF02958@xxxxxxxxxxxxxxxxxxxxxxxxxxx>の記事において
> taca@xxxxxxxxxxxxxxxxxxxxxxさんは書きました。
> >> > diff -urN namazu-1.3.0.11/src/output.c namazu-1.3.0.12/src/output.c
> >> > --- namazu-1.3.0.11/src/output.c	Wed Jan 26 22:38:51 2000
> >> > +++ namazu-1.3.0.12/src/output.c	Tue Nov 27 17:16:48 2001
> >> > @@ -13,8 +13,15 @@
> >> >  	if (!strncmp(qs, "whence=", 7)) {
> >> >  	    printf("whence=%d", w);
> >> >  	    for (qs += 7; isdigit(*qs); qs++);
> >> > -	} else
> >> > -	    fputc(*(qs++), stdout);
> >> > +	} else {
> >> > +	    /* '"' is converted to entities "&quot;" */
> >> > +	    if (*qs == '"') {
> >> > +		fputs("&quot;", stdout);
> >> > +	    } else {
> >> > +		fputc(*qs, stdout);
> >> > +	    }
> >> > +	    qs++;
> >> > +	}
> >> ここのfputc(3)って、単純にputc(3)では、まずいのでしょうか?
> 
>   この頃の coding 規約に関しては私はあまり良く知りません... 多分なんら
> かの意図があって高林さんが fputc で統一したのだろうと思います。下手に
> 変更するとかえって enbug を起こしそうなので、とりあえずそのまま流儀に
> 従っています。

fputc() は 規格上必ず関数として実装されていることが保証されていますが、
 putc() は 処理系によってはマクロとして実装されている可能性があるかも
しれないという点だけが異なるようです。

| * 名前
|        fputc, putc - 文字の出力
|
| * 書式
|        #include <stdio.h>
|
|        int fputc(int c, FILE *stream);
|        int  putc(int c, FILE *stream);
|
| * 説明
|        fputc() は、キャラクタ c を unsigned char にキャストし、
|        stream に書き込む。マクロではなく関数として実装される。
|
|        putc()  は、 stream を 2 回以上評価するマクロとして実装さ
|        れているかもしれないという点を除き、fputc() と等価である。

ですので、putc() を用いた場合、マクロの副作用が出る可能性があるので、
注意する必要があります。(stream に ++ 演算子が含まれている場合など)

ある C コンパイラの処理系では、stdio.h の中で以下のマクロを定義しています。

#define putc(_c,_stream)  (--(_stream)->_cnt >= 0 \
   ? 0xff & (*(_stream)->_ptr++ = (char)(_c)) :  _flsbuf((_c),(_stream)))

それぞれのメリットとデメリットをまとめると、、、

 1. fputc() 関数を用いた場合、
  - 関数呼び出しのオーバーヘッドがあるが、
  - 実行ファイルのバイナリサイズが小さくなる傾向があり、
  - マクロの副作用はないので、安全にプログラミングできる。

 2. putc() マクロを用いた場合、
  - 関数呼び出しのオーバーヘッドがなく、高速に処理できるが、
  - 実行ファイルのバイナリサイズが大きくなる傾向があり、
  - マクロの副作用があるので、プログラミングの際に注意する必要がある。

といったところでしょうか。

あとは、ソースコードの一貫性を保つためのスタイル上の問題になるかと思います。

--
  広島市立大学 情報科学部 情報機械システム工学科 知能ロボット講座
     竹迫 良範 <takesako@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx>