【问题标题】:getc() vs fgetc() - What are the major differences?getc() 与 fgetc() - 主要区别是什么?
【发布时间】:2013-08-31 02:50:16
【问题描述】:

我在任何地方看到“它实际上是相同的”,或者类似的东西......

来自The GNU C Programming Tutorial

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

还有哪些不同之处?我听说它们每个都有不同的实现(并且可以用作宏),但是,是什么让它们如此不同(或足够不同)以使它们都在标准 C 库(或规范)中?

【问题讨论】:

  • 这里有很好的信息:stackoverflow.com/questions/5186457/…
  • @user814064,您的链接引用fgets vs fgetc,OP 询问getc vs fgetc
  • getc() 在该链接中被提及,以及它的优点。
  • @user814064,你可以直接链接到答案(点击分享stackoverflow.com/a/5186605/1606345
  • 非常感谢。我发帖不到一周,我有很多东西要学。我以为那是 Facebook 什么的。

标签: c fgetc getc


【解决方案1】:

来自Advanced Programming in Unix Environment

...

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

  • getc 的参数不应是具有副作用的表达式。
  • 既然fgetc被保证是一个函数,我们可以取它的地址。这允许我们将fgetc 的地址作为参数传递 到另一个功能。
  • 调用 fgetc 可能需要比调用 getc 更长的时间,因为调用函数通常需要更多时间。

...

【讨论】:

  • 我 +1,但是:为什么它们都在标准库中?为什么不能都是宏?
  • @day 你的意思是“如何”,如“实施细节是什么”或“你怎么能做到这一点(道德上或技术上)”?
【解决方案2】:

在 99.9% 的情况下,这些差异似乎毫无意义。

有一点可能会有所作为 - The man pagegetc() 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!
}

如果getc 多次评估f++,则每次迭代都会将f 推进一次以上。相比之下,fgetc 在这种情况下是安全的。

【讨论】:

    【解决方案3】:

    本质上是相同的(或相似到不打扰)。您应该查看它们的实现:GNU libcMUSL libc 是免费软件实现。它们现在可以实现为内联函数(与宏一样快)。

    而且我不会那么麻烦。在现实生活中,I/O 主要受硬件限制(例如访问磁盘的时间)。

    【讨论】:

      猜你喜欢
      • 2019-09-04
      • 2017-10-21
      • 2012-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-22
      • 2012-06-12
      • 1970-01-01
      相关资源
      最近更新 更多