【问题标题】:I am not understanding several aspects of this c code [closed]我不了解此 c 代码的几个方面[关闭]
【发布时间】:2014-05-30 18:49:04
【问题描述】:
void quit()
{
fprintf(stderr, "memory exhausted\n");
exit(1);
}

他们为什么使用 fprintf?另外,如果程序的那部分成功退出,stderr 是什么,为什么它是 exit(1)? 干杯

【问题讨论】:

标签: c stderr printf


【解决方案1】:

稍微回溯一下,printf 是 fprintf 的一个不太通用的版本,它使用标准输出流,也称为 stdout。 stderr 是另一个标准流,但它通常用于输出程序遇到的错误。您可以以不同方式重定向这两个流,以便仅在需要时看到错误或输出。

http://en.wikipedia.org/wiki/Standard_streams

exit(1) 只是一个约定,表明程序没有成功退出。事实上,除 0 之外的任何退出代码通常都意味着 C 标准中的失败。

【讨论】:

  • 如果程序在内存耗尽的情况下退出,您仍然需要解释为什么 exit(1) 是一个不错的选择。
  • +1 就是这样。我要补充一点,0 成功和其他任何失败的约定都在 C 标准中。
  • printffprintfless 通用版本。使用fprintf,我可以写入任何流。 printffprintf 的包装器。
  • 是的,你是对的。修好了。
【解决方案2】:

exit(1) 告诉操作系统(或任何调用你的程序)程序的结果是1

操作系统赋予此的含义取决于系统,例如在 Unix 风格的 shell 中,它意味着 失败,而在 VMS 中,它意味着 成功

stdlib.h 中定义了一个名为EXIT_FAILURE 的可移植宏,它将指示正在使用的操作系统的相应故障代码。

还有一个宏EXIT_SUCCESS,但是定义0EXIT_SUCCESS都返回成功码,所以你可以exit(0)

执行exit 类似于从main 返回。显然,当您 exit 时,您会绕过在从您现在的位置返回到 main 的过程中运行的任何代码。

【讨论】:

    【解决方案3】:

    fprintfprintf 的更通用版本,其中输出被发送到文件。 stderr 是标准错误输出,所以fprintf(stderr, "memory exhausted\n"); 将“内存耗尽”写入标准错误输出。

    【讨论】:

      【解决方案4】:

      printf() 函数一般输出到标准输出流。但是,还有其他接受输出的流,包括 stderr。对于不经意的观察者来说,这两个流似乎是相同的。两者似乎都只是将其内容发送到终端屏幕。

      -
      

      但是,stdout an 和 stderr 的这种分离允许这两个流以各种方式重定向。例如,stderr 可以被重定向到一个文件;而 stdout 可以重定向(或通过管道传输)到另一个应用程序的 stdin,例如 sort、less 等。

      -
      

      因此,正常的程序输出一般发送到stdout流,而错误信息、警告等一般发送到stderr。

      在你的例子中:

      fprintf(stderr, "memory exhausted\n");
      

      程序正试图通知用户错误情况。这仅在发生错误情况时输出。虽然可以只使用 printf() 并将消息发送到 stdout 流,但惯例是将此类错误消息发送到 stderr 流。因此,使用 fprintf() 可以指定输出流。

      -
      

      顺便说一句,您也可以使用 fprintf() 将输出发送到标准输出。以下语句是等价的:

      printf("Hello world!\n");
      fprintf(stdout, "Hello world!\n");
      

      【讨论】:

      • 谢谢!这真的很有帮助
      猜你喜欢
      • 2016-10-05
      • 2013-11-02
      • 1970-01-01
      • 2011-11-24
      • 1970-01-01
      • 2015-05-11
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      相关资源
      最近更新 更多