"UNIX环境中的高级编程,第3版",第151页:
getc和之间的区别fgetc是getc可以实现为宏,而fgetc不能实现为宏.这意味着三件事:
- 论证
getc不应该是带有副作用的表达.- 由于
fgetc保证是一个功能,我们可以采取其地址.这允许我们将fgetc作为参数的地址传递给另一个函数.- 呼叫
fgetc可能需要比调用更长的时间getc,因为通常需要更多时间来调用函数.
使用流指针作为参数的函数签名会出现什么"带副作用的表达式"?
#include<stdio.h>
int getc(FILE* stream);
int fgetc(FILE* stream);
Run Code Online (Sandbox Code Playgroud)
可能有数百种方法传递具有副作用的表达式,但"可信"的方法可能是这样的:
FILE *files[NUM_FILES];
...
int rc = getc(files[counter++]);
Run Code Online (Sandbox Code Playgroud)
如果getc作为宏实现不佳,则表达式files[counter++]可能会被多次评估,从而导致意外行为.