C言語関係掲示板

過去ログ

No.962 getcとfgetcの違い

[戻る] [ホームページ]
No.12427

getcとfgetcの違い
投稿者---リポD(2004/02/02 20:29:36)


C言語初心者の者です。
色々な本やHPを見ましたが、getcとfgetcの違いが分かりません。
どちらも「ファイルを1文字ずつ読み込む」までは分かりました。
しかし、あちこちに基本的にgetcとfgetcは等価であるがgetcは「関数とマクロ」などと書かれています。
この「関数とマクロ」と言うのはどう言う意味なのでしょうか?
もし宜しければ極々簡単に何か例を示しながら教えて頂けるとありがたいのですが?


No.12428

Re:getcとfgetcの違い
投稿者---YuO(2004/02/02 21:34:58)


>色々な本やHPを見ましたが、getcとfgetcの違いが分かりません。

根本的な違いはありません。
JIS X 3010-1993 プログラミング言語C 7.9.7.5 getc関数には,
機能 getc関数は,fgetcと等価とする

と書かれています。


>しかし、あちこちに基本的にgetcとfgetcは等価であるがgetcは「関数とマクロ」などと書かれています。
>この「関数とマクロ」と言うのはどう言う意味なのでしょうか?

getcも関数です。
ただし,上記の後に,
ただし,マクロとして実装されたgetc関数は,streamを2度以上評価することがある。したがって,実引数streamは,副作用を伴わない式でなければならない。

という記述が続きます。

有名な話ですが,例えば
#define MAX(a, b) ((a) < (b) ? (b) : (a))

のようなマクロに対して,
MAX(++i, ++j)

のように副作用のある式を渡すと,++iが二度評価されたり++jが二度評価されたりします。
そのような可能性があるから,副作用のある式を渡すな,というのがJISの記述です。
(getc)(stream)のように,関数を確実に呼び出してしまえばgetcでも副作用のある記述を書くことができます。

No.12433

Re:getcとfgetcの違い
投稿者---リポD(2004/02/02 23:05:09)


すみません。無知なところで質問させて下さい。
ここで言うマクロというのはどう言うことなのでしょうか?
マクロと言う言葉(意味)がイマイチ分かりません。