“UNIX环境中的高级编程,第3版”,第151页:
getc和fgetc的区别在于,getc可以实现为宏,而fgetc不能实现为宏。这意味着三件事:
getc的参数不应该是一个有副作用的表达式。fgetc保证是一个函数,我们可以获取它的地址。这允许我们将fgetc的地址作为参数传递给另一个函数。fgetc的调用可能比调用getc花费的时间更长,因为调用函数通常需要更长的时间。以流指针作为参数的函数签名可以发生什么“有副作用的表达式”?
#include<stdio.h>
int getc(FILE* stream);
int fgetc(FILE* stream);发布于 2013-12-17 08:19:37
传递带有副作用的表达式的方法可能有数百种,但“可信”的方法可能如下所示:
FILE *files[NUM_FILES];
...
int rc = getc(files[counter++]);如果getc作为宏实现得不好,则可以多次计算表达式files[counter++],从而导致意外行为。
发布于 2013-12-17 08:19:44
举个例子,不要写
FILE* foo() { puts( "Bah!\n" ); return stdout; }
void advance() { getc( foo() ); }https://stackoverflow.com/questions/20629059
复制相似问题