我不了解此 c 代码的几个方面[关闭]

Posted

技术标签:

【中文标题】我不了解此 c 代码的几个方面[关闭]【英文标题】:I am not understanding several aspects of this c code [closed] 【发布时间】:2014-05-30 18:49:04 【问题描述】:
void quit()

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

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

【问题讨论】:

您可以访问文档,对吧? 你有权访问谷歌吗? ***.com/questions/4627330/… 【参考方案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");

【讨论】:

谢谢!这真的很有帮助

以上是关于我不了解此 c 代码的几个方面[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

求助QT中关于QGraphics 方面的几个小问题

关于JAVA程序内存安全内存泄漏问题,你应该了解的几点!

总结了零基础学习Java编程语言的几个基础知识要点

JavaScript 中Array数组的几个内置函数

我想用C#里的WPF应用程序实现按一个按钮就能使相关联的几个圆的填充颜色改变,应该学习那方面知识呢?

如何用 C 编写面向对象的代码? [关闭]