我不理解这个c代码的几个方面

时间:2014-04-16 04:53:22

标签: c stderr printf

void quit()
{
fprintf(stderr, "memory exhausted\n");
exit(1);
}

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

4 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

exit(1)告诉操作系统(或调用您程序的任何内容)程序的结果为1

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

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

还有一个宏EXIT_SUCCESS,但定义0EXIT_SUCCESS都返回成功代码,因此您只能exit(0)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

printf()函数通常输出到stdout流。但是,还有其他流接受输出,包括stderr。对于不经意的观察者来说,似乎这两条流是相同的;它们似乎只是将其内容发送到终端屏幕。

-

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

-

因此,正常程序输出通常发送到stdout流,而错误消息,警告等通常会发送到stderr。

在你的例子中:

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

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

-

顺便说一下,您也可以使用fprintf()将输出发送到stdout。以下陈述是等效的:

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