getc()vs fgetc() - 主要区别是什么?

Joe*_* DF 45 c getc fgetc

在任何地方我都看到"它实际上是相同的"或类似的东西......

来自GNU C编程教程:

GNU C库中还有另一个名为fgetc的函数.它在大多数方面与getc相同,除了getc通常作为宏函数实现并且高度优化,因此在大多数情况下是优选的.(在您从标准输入读取的情况下,getc与fgetc一样快,因为与计算机读取输入的速度相比,人类输入速度较慢,但​​是当您从不是由人工交互生成的流中读取时, fgetc可能更好.)

还有什么区别?我听说他们每个都有不同的实现(一个可以用作宏),但是,是什么让它们与标准C库(或规范)中的它们完全不同(或不同)?

moh*_*hit 45

来自Advanced Programming in Unix Environment:

...

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

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

...


ugo*_*ren 18

似乎差异在99.9%的情况下毫无意义.

有一点可能会有所不同 - 手册页getc() may be implemented as a macro which evaluates stream more than once.

它可能会导致某些(非常有用)情况下的奇怪行为,例如:

FILE *my_files[10] = {...}, *f=&my_files[0];
for (i=0; i<10; i++) {
    int c = getc(f++);    // Parameter to getc has side effects!
}
Run Code Online (Sandbox Code Playgroud)

如果getc评估f++多次,则f每次迭代将提前多次.相比之下,fgetc在这种情况下是安全的.