没有人,永远不会检查putc,fputc,puts,fputs,putchar(也许是printf)函数的返回值。为什么?

时间:2016-12-08 15:20:57

标签: c performance error-handling puts putchar

$ cd glibc-2.23
$ grep -ErI --include='*.c' '= *f?put([cs]|char)\>' |wc -l
1
$ grep -ErI --include='*.c' '[^= ] *f?put([cs]|char)\>' |wc -l
1764

$ man putc
...
RETURN VALUE
   fputc(), putc() and putchar() return the character written
   as an unsigned char cast to an int or EOF on error.

也许它不够可能"例如,在 putchar 的序列中,一个或两个在前面和后面的一个或两个失败时会成功失败吗?
或者,至少99.9999%的实现,他们可能没有"返回suchandsuch"声明?
或者,在每个字节后(在putchar,putc,fputc的情况下)连续错误检查可能会导致性能下降太大?

2 个答案:

答案 0 :(得分:1)

忽略函数的返回值是软件中许多难以发现的错误的根源。您的声明" nobody"检查返回值是不正确的。高可靠性软件系统会检查返回值。

答案 1 :(得分:0)

由于几个原因,这些往往被忽略。首先,对于大多数系统来说,它们存在的问题可能性很大,以至于大多数人都不在乎。

其次,因为如果它们确实失败了,那么你无论如何都可以做的相对较少 - 如果操作系统已经进入写入文件失败的状态,通常的反应如显示消息对用户和/或记录错误也可能很容易失败。

最后,在大多数情况下,您可以简化问题:执行I / O,然后只检查fclose是否成功。如果文件已进入失败状态,则可能会导致fclose失败,因此较早捕获错误(执行I / O时)通常只是优化 - 您只能通过检测同一问题检查fclose,尽管在检测到问题后你可能会浪费一些时间来编写文件。

即使检查来自fclose的回复,相当也是不寻常的。你仍然遇到与上面提到的相同的问题:如果系统失败到失败的程度,那么你对失败作出反应的大部分尝试也会失败。

但仍有一些情况可行。例如,考虑将文件从一个地方移动到另一个地方(例如,通过网络)。您希望在删除源文件之前检查是否已成功将数据写入目标。在这种情况下,检查来自fclose的返回是一种相当简单的方法,可以减少销毁用户文件的可能性,以防复制尝试失败。