fgetc和getc的区别
书上是这么写得:
区别在于调用getc函数时所用的参数fp不能是有副作用的表达式,而fgetc函数则可以,也就是说,getc可以被当作宏来调用,而fgetc只能作为函数来调用。
因此,调用getc比调用fgetc耗费的时间少。
int getc(FILE *fp)
int fgetc(FILE *fp)
有两个地方不理解。一个是什么叫做有副作用的表达式? 另外一个就是getc怎么被当作宏来调用?
最好有个小例子,谢谢
[解决办法]
http://topic.csdn.net/u/20080513/21/c4fe0a8e-eef1-4777-92e8-80c1998c1a9a.html
转:(
所以fgetc是一个函数
getc是一个宏
一般来说宏产生较大的代码,但是避免了函数调用的堆栈操作,所以速度会比较快。
但是也有例外的情况:
1. 很多RISC处理器(如SUN SPARC)使用寄存器窗口重叠技术,
(http://server.chinabyte.com/404/157904_1.shtml),
在寄存器充足的情况下,根本不需要堆栈操作,fgetc函数比getc宏更快
2. 在多线程的情况下,为了线程同步,getc和fgetc可能是相同的。
)
[解决办法]
有副作用的表达式,指的是表达式执行后,会改变表达式中某些变量的值
最简单的如++i,这个表达式执行后,i的值会改变,这样的表达式是不应该在宏调用里出现的
#define MACRO_SQRT(x) (x)*(x)
int func_sqrt(int x)
{
return x * x;
}
上面是两个计算平方的方法,一个用宏,一个用函数
int i=2;
MACRO_SQRT(++i) 与 func_sqrt(++i)将是不同的~
查了下getc,在stdio.h中有宏定义的版本,而fgetc是函数~