1

「UNIX 環境での高度なプログラミング、第 3 版」、151 ページ:

getcとの違いはfgetc、マクロとして実装できるgetcのに対し、 はマクロfgetcとして実装できないことです。これは、次の 3 つのことを意味します。

  • への引数は、副作用のある式であってgetcはなりません。
  • fgetc関数であることが保証されているため、そのアドレスを取得できます。これにより、 のアドレスをfgetc引数として別の関数に渡すことができます。
  • 関数の呼び出しには通常より時間がかかるため、 への呼び出しは への呼び出しfgetcよりもおそらく時間がかかります。getc

ストリーム ポインターをパラメーターとして使用する関数シグネチャに対して、どのような「副作用のある式」が発生する可能性がありますか?

#include<stdio.h>
int getc(FILE* stream);
int fgetc(FILE* stream);
4

2 に答える 2

6

副作用のある式を渡す方法はおそらく何百もありますが、「信頼できる」方法は次のようなものです。

FILE *files[NUM_FILES];
...
int rc = getc(files[counter++]);

getcがマクロとして適切に実装されていない場合、式がfiles[counter++]複数回評価され、予期しない動作が発生する可能性があります。

于 2013-12-17T08:19:37.223 に答える
1

例として、書かないでください

FILE* foo() { puts( "Bah!\n" ); return stdout; }

void advance() { getc( foo() ); }
于 2013-12-17T08:19:44.057 に答える