如何将“带有副作用的表达”传递给getc?

时间:2013-12-17 08:14:19

标签: c fgetc getc

  

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

     

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

     
      
  • getc的参数不应该是带副作用的表达式
  •   
  • 由于保证fgetc是一个函数,我们可以获取其地址。这允许我们将fgetc的地址作为参数传递给另一个   功能
  •   
  • 拨打fgetc的时间可能比拨打getc的时间长,因为通常需要更长的时间才能拨打电话。
  •   

使用流指针作为参数,函数签名会出现“带副作用的表达式”吗?

#include<stdio.h>
int getc(FILE* stream);
int fgetc(FILE* stream);

2 个答案:

答案 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() ); }