どこでも「実質的に同一」または似たようなものが表示されます...
から GNU Cプログラミングチュートリアル :
GNU Cライブラリにはfgetcと呼ばれる別の関数があります。getcは通常マクロ関数として実装され、非常に最適化されているため、ほとんどの点でgetcと同じです。 (標準入力から読み取る場合は、コンピューターが入力を読み取る速度と比較して人間がゆっくり入力するため、getcはfgetcとほぼ同じ速度ですが、対話形式で生成されないストリームから読み取る場合は人間、fgetcのほうがおそらく良いでしょう。)
他の違いは何ですか?それらはそれぞれ異なる実装(およびマクロとして使用可能)を持っていると聞いたことがありますが、それらが標準Cライブラリ(または仕様)の両方に存在するためにそれらをまったく異なる(または十分に異なる)ものにしているのはなぜですか?
から Advanced Programming in Unix Environment
:
...
getc
とfgetc
の違いは、getc
をマクロとして実装できるのに対し、fgetc
はマクロとして実装できないことです。これは3つのことを意味します。
getc
の引数は、副作用のある式であってはなりません。fgetc
は関数であることが保証されているため、そのアドレスを取得できます。これにより、fgetc
のアドレスを引数として別の関数に渡すことができます。- Fgetcの呼び出しは、おそらく関数の呼び出しに時間がかかるため、
getc
の呼び出しよりも時間がかかる可能性があります。...
違いは、99.9%のケースで、意味がないようです。
違いを生む可能性のある1つのポイント- manページ はgetc() may be implemented as a macro which evaluates stream more than once
と言います。
いくつかの(あまり役に立たない)場合に奇妙な動作を引き起こす可能性があります:
FILE *my_files[10] = {...}, *f=&my_files[0];
for (i=0; i<10; i++) {
int c = getc(f++); // Parameter to getc has side effects!
}
getc
がf++
を複数回評価する場合、反復ごとにf
を複数回進めます。それに対して、fgetc
はそのような状況では安全です。