我知道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;
}
一般情况下?
答案 0 :(得分:5)
在main
函数中,exit(N)
和return N;
几乎完全相同(但请参见下文)。
exit()
终止程序的整个执行。 return
仅从当前函数返回。 (我知道你说你知道不同之处,但我想完成)。
如果你在main
,你可以使用你喜欢的任何一个。选择是一种风格问题,我认为没有任何关于哪种风格最好的协议。您可以考虑使用exit
,以防main
中的代码稍后转移到其他功能中。我会使用return
中的main
来更多正常的程序终止。
请注意,传递给exit
或return
使用的值具有某种特定于系统的含义。该值将返回给调用环境。 0
或EXIT_SUCCESS
表示成功; EXIT_FAILURE
表示失败。 (EXIT_SUCCESS
和EXIT_FAILURE
是在<stdlib.h>
中定义的宏,与定义exit
函数的标头相同。)
任何其他值都具有系统特定的含义。特别是,有exit(1)
表示成功而非失败的系统(特别是VMS)。在类似Unix的系统上,1
表示失败,EXIT_FAILURE
将被定义为1.
您可以将EXIT_SUCCESS
和EXIT_FAILURE
与return
或exit()
一起使用。
另一方面,如果您需要指定多种类型的失败,EXIT_FAILURE
将是不够的。在类Unix系统上,可能在Windows上,0
表示成功,1
表示或多或少的通用故障,而其他小正整数表示其他类型的故障。如果您需要,请随意使用特定值;您可能并不关心您的程序可能无法在VMS上按预期工作。 (我将为您使用的各种退出值定义常量,并清楚地说明它们在文档中的含义。)同样,您可以使用exit()
或return
,无论哪个更方便。< / p>
我在上面说过,来自exit(N)
的{{1}}和return N
几乎相同。
在{C}中,main()
以递归方式调用自身是合法的。如果您的程序在main
中,但在main
的初始调用中没有,则main
将终止return
的当前执行,但不会终止该程序;对于main
以外的任何函数,它就像return
与exit()
一样。递归地调用main
几乎总是一个坏主意,所以值得注意,但不值得担心。
此外,main
可用于注册在程序退出时自动调用的函数。无论函数是否因atexit()
或exit()
而终止,都将调用任何此类函数。差异(这是一个令人难以置信的模糊之处)是return
被exit()
调用,main
立即离开return
。因此,如果您的main
注册函数之一引用atexit()
内的局部变量,那么如果您调用main
,该变量仍然存在,但如果您执行exit()
则不会声明。你必须不遗余力地做到这一点,并且没有充分的理由这样做,所以你几乎肯定不必担心这个特定的问题。
答案 1 :(得分:1)
如果在main
中使用,两者都会做同样的事情,因此我会选择return 1
,因为它更简单且无任何#include
。
exit
例程之外时, main
很方便。
答案 2 :(得分:0)
这是你的选择。
标准C库启动代码可能如下所示:
exit(main(argc,argv))
无论如何,从主要的回归可能会打电话给退出。我个人的选择是从main返回退出代码,因为它不会掩盖代码的流程。