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

And*_*man 1 c getc fgetc

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

getc和之间的区别fgetcgetc可以实现为宏,而fgetc不能实现为宏.这意味着三件事:

  • 论证getc不应该是带有副作用的表达.
  • 由于fgetc保证是一个功能,我们可以采取其地址.这允许我们将fgetc作为参数的地址传递给另一个函数.
  • 呼叫fgetc可能需要比调用更长的时间getc,因为通常需要更多时间来调用函数.

使用流指针作为参数的函数签名会出现什么"带副作用的表达式"

#include<stdio.h>
int getc(FILE* stream);
int fgetc(FILE* stream);
Run Code Online (Sandbox Code Playgroud)

Mat*_*Mat 6

可能有数百种方法传递具有副作用的表达式,但"可信"的方法可能是这样的:

FILE *files[NUM_FILES];
...
int rc = getc(files[counter++]);
Run Code Online (Sandbox Code Playgroud)

如果getc作为宏实现不佳,则表达式files[counter++]可能会被多次评估,从而导致意外行为.

  • "糟糕"?"我怀疑任何理智的C库"?你不知道你在说什么.原来的stdio库和它的许多后代实现了getc(f)就像` - (f) - > ptr <(f) - > end?*(f) - > ptr ++:__ getc(f)`for speed,这就是为什么允许getc成为重新评估其参数的宏. (2认同)