选择哪一个:退出还是返回? [复制]
Posted
技术标签:
【中文标题】选择哪一个:退出还是返回? [复制]【英文标题】:Which one choose: exit or return? [duplicate] 【发布时间】:2014-02-11 18:07:36 【问题描述】:我知道return
和exit()
(link) 之间的区别,但我不知道何时何地选择其中一个而不是另一个。例如,从this 的答案我知道return
是一个更好的选择,但从another 我的理解正好相反。
一个例子:在这段代码中(来自this的问题)是最好使用exit()
还是return
?
int read_file (char *filename, int **vet)
FILE *fin;
if ( !(fin = fopen(filename, "r")) )
perror(filename);
return -1;
* vet = malloc (10 * sizeof(int));
if ( *vet == NULL )
perror("Memory allocation error.\n");
return -2;
/* ... */
return fclose(fin);
int main ()
char filename[100];
int *vet;
if ( read_file(filename, &vet) )
/* ??? exit(1) OR return -1 ??? */
return 0;
一般来说?
【问题讨论】:
你写的exit(1) OR return -1 ???
-- 1
和 -1
不等价。
@MikeW 我已经在我的链接中链接了同一个问题:它是不同的。
@user 并没有什么不同。该问题的差异有一个全面的解释。没有正确的答案——这取决于你在做什么。在这种情况下,你的问题没有什么意义。
@user:不,一点也不。无论是调用exit
还是执行return
语句,程序返回的状态值都应该完全相同。对于某些函数,有使用负值返回错误的约定,但这不适用于main
。唯一的 portable 状态值是 0
、EXIT_SUCCESS
和 EXIT_FAILURE
。 (在类 Unix 系统上,负值无论如何都映射到范围 0..255,所以 return -1;
可能等同于 return 255;
。)
@KeithThompson 是的,对不起:我在阅读您的回复之前写了我的评论!
【参考方案1】:
如果在main
中使用,两者都会做同样的事情,所以我会选择return 1
,因为它更简单并且无需任何#include
即可工作。
exit
在您想从函数中终止或在 main
例程之外终止时非常方便。
【讨论】:
是的,但return 1;
的含义是系统特定的。 (在 Unix 上,它表示成功;在 VMS 上,它表示失败)。 return EXIT_FAILURE;
更可靠更清晰,但它需要#include <stdlib.h>
。
@KeithThompson 我完全同意这一点。只是,问题集中在exit(1)
而不是return 1
,所以我的答案是。【参考方案2】:
这是你的选择。
标准 C 库启动代码可能如下所示:
exit(main(argc,argv))
从 main 函数返回可能调用 exit 无论如何。我个人的选择是从 main 返回退出代码,因为它不会掩饰代码流。
【讨论】:
【参考方案3】:在main
函数中,exit(N)
和return N;
几乎相同(但见下文)。
exit()
终止程序的整个执行。 return
仅从当前函数返回。 (我知道你说过你知道区别,但我想要完整)。
如果你在main
,你可以使用任何你喜欢的。选择是风格问题,我认为对于哪种风格最好没有任何一致意见。您可以考虑使用exit
,以防main
中的代码稍后被移动到其他函数中。我会使用 main
中的 return
来进行更多正常程序终止。
请注意,传递给exit
或return
使用的值具有某种特定于系统的含义。该值返回到调用环境。 0
或 EXIT_SUCCESS
表示成功; EXIT_FAILURE
表示失败。 (EXIT_SUCCESS
和 EXIT_FAILURE
是在 <stdlib.h>
中定义的宏,与定义 exit
函数的头相同)。
任何其他值都将具有系统特定的含义。特别是,有一些系统(特别是 VMS)exit(1)
表示成功,而不是失败。在类 Unix 系统上,1
表示失败,EXIT_FAILURE
将被定义为 1。
您可以将EXIT_SUCCESS
和EXIT_FAILURE
与return
或exit()
一起使用。
另一方面,如果您需要指定多种故障,EXIT_FAILURE
将不够用。在类 Unix 系统上,可能在 Windows 上,0
表示成功,1
表示或多或少的一般故障,而其他小的正整数表示其他类型的失败。如果您需要,请随意使用特定值;您可能不在乎您的程序可能无法在 VMS 上按预期运行。 (我会为您使用的各种退出值定义常量,并在文档中清楚地说明它们的全部含义。)同样,您可以使用exit()
或return
,以更方便为准。
我在上面说过main()
中的exit(N)
和return N
几乎是相同的。
main
在 C 中递归调用自身是合法的。如果你的程序在main
中,但不在main
的初始调用中,那么return
会终止main
的当前执行,但不会终止程序;这就像return
与exit()
对main
以外的任何功能。递归调用main
几乎总是一个坏主意,所以这一点值得注意,但不值得担心。
另外,atexit()
可用于注册要在程序退出时自动调用的函数。无论函数因exit()
或return
而终止,任何此类函数都将被调用。区别(这是一个非常模糊的区别)是exit()
被main
调用,而return
立即离开main
。因此,如果您的atexit()
注册函数之一引用了main
内的局部变量,则如果您调用exit()
,该变量仍然存在,但如果您执行return
语句则不会存在。您必须竭尽全力才能实现这一点,而且没有充分的理由这样做,因此您几乎可以肯定不必担心这个特定问题。
【讨论】:
如果我想区分错误?例如:如何用EXIT_FAILURE
写出exit(1)
、exit(2)
等代码?
@user:您不能以完全可移植的方式做到这一点。但是对于大多数系统(当然包括 Linux 和其他类 Unix 系统,也可能包括 Windows),exit(1)
表示或多或少的一般故障,2 或更高表示一些更具体的错误(例如,grep
使用0 表示匹配,1 表示不匹配,2 表示错误,例如丢失文件)。 EXIT_FAILURE
可能等于 1,但如果您需要特定的数值,只需编写 exit(1)
、exit(2)
等(或 return 1
、return 2
)。我已经更新了我的答案;见第 7 段。
+1 表示atexit
段落。我以前从未考虑过这种行为差异。以上是关于选择哪一个:退出还是返回? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
选择哪一个:ASP.NET MVC 还是 RESTful WCF?
安卓系统的手机怎么使用粘贴板?就是连续复制好几次文字,然后一长按就供你选择,粘贴哪一个?😊
React 还是 Vue: 你应该选择哪一个Web前端框架?