1

“UNIX 环境中的高级编程,第 3 版”,第 151 页:

getc和之间的区别在于fgetc可以getc实现为宏,而fgetc不能实现为宏。这意味着三件事:

  • to 的参数getc不应是具有副作用的表达式
  • 既然fgetc保证是一个函数,我们就可以取它的地址。这允许我们将地址fgetc作为参数传递给另一个函数。
  • 调用 tofgetc可能比调用 需要更长的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 回答