“UNIX环境中的高级编程,第3版”,第151页:
getc
和fgetc
之间的区别在于getc
可以实施 作为宏,而fgetc
不能作为宏实现。这意味着 三件事:
getc
的参数不应该是带副作用的表达式。- 由于保证
fgetc
是一个函数,我们可以获取其地址。这允许我们将fgetc
的地址作为参数传递给另一个 功能- 拨打
fgetc
的时间可能比拨打getc
的时间长,因为通常需要更长的时间才能拨打电话。
使用流指针作为参数,函数签名会出现“带副作用的表达式”吗?
#include<stdio.h>
int getc(FILE* stream);
int fgetc(FILE* stream);
答案 0 :(得分:6)
可能有数百种方法传递具有副作用的表达式,但“可信”的表达式可能是:
FILE *files[NUM_FILES];
...
int rc = getc(files[counter++]);
如果getc
作为宏实现效果不佳,则表达式files[counter++]
可能会被多次评估,从而导致意外行为。
答案 1 :(得分:1)
举个例子,不要写
FILE* foo() { puts( "Bah!\n" ); return stdout; }
void advance() { getc( foo() ); }