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 """ */
> >> > + if (*qs == '"') {
> >> > + fputs(""", 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>