我不了解此 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 标准中。printf
是fprintf
的less 通用版本。使用fprintf
,我可以写入任何流。 printf
是 fprintf
的包装器。
是的,你是对的。修好了。【参考方案2】:
exit(1)
告诉操作系统(或任何调用你的程序)程序的结果是1
。
操作系统赋予此的含义取决于系统,例如在 Unix 风格的 shell 中,它意味着 失败,而在 VMS 中,它意味着 成功。
在stdlib.h
中定义了一个名为EXIT_FAILURE
的可移植宏,它将指示正在使用的操作系统的相应故障代码。
还有一个宏EXIT_SUCCESS
,但是定义0
和EXIT_SUCCESS
都返回成功码,所以你可以exit(0)
。
执行exit
类似于从main
返回。显然,当您 exit
时,您会绕过在从您现在的位置返回到 main
的过程中运行的任何代码。
【讨论】:
【参考方案3】:fprintf
是printf
的更通用版本,其中输出被发送到文件。 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 代码的几个方面[关闭]的主要内容,如果未能解决你的问题,请参考以下文章