ᴜsᴇ*_*sᴇʀ 1 c return return-value exit
我知道return和exit()(链接)之间的区别,但我不知道在何时何地选择一个而不是另一个.例如,根据这个答案,我理解这return是一个更好的选择,但从另一个我理解相反.
一个例子:在这个代码中(来自这个问题)是否优先使用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;
}
Run Code Online (Sandbox Code Playgroud)
一般吗?
从内部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函数的标头).
任何其他值都具有系统特定的含义.特别是,有一些系统(特别是VMS)exit(1)表示成功,而不是失败.在类Unix系统上,1表示失败,EXIT_FAILURE将定义为1.
您可以使用EXIT_SUCCESS和EXIT_FAILURE使用return或exit().
另一方面,如果您需要指定多种类型的故障,EXIT_FAILURE则还不够.在类Unix系统上,可能在Windows上,0表示成功,1表示或多或少的通用故障,而其他小正整数表示其他类型的故障.如果您需要,请随意使用特定值; 您可能不在乎您的程序可能无法在VMS上按预期工作.(我定义常量为你使用各种出口值,并明确说出他们所有的文档里的意思.)同样,你可以使用exit()或return,取其更方便.
我上面提到exit(N)和return N从main()是几乎相同的.
在C中合法main地递归调用自身是合法的.如果你的程序在main,但不在初始调用中main,那么return将终止当前执行main,但不会终止程序; 它就像return对比exit()除了以外的任何功能main.main递归调用几乎总是一个坏主意,所以值得注意,但不值得担心.
此外,atexit()还可用于注册在程序退出时自动调用的函数.无论函数是否由于exit()或终止,都将调用任何此类函数return.差异(这是一个令人难以置信的模糊之处)是exit()被称为main,并return立即离开main.因此,如果您的一个注册atexit()函数引用了一个局部变量main,那么该变量在您调用时仍然存在exit(),但如果您执行了一个return语句则不会存在.你必须不遗余力地实现这一点,并且没有充分的理由这样做,所以你几乎肯定不必担心这个特殊问题.
| 归档时间: |
|
| 查看次数: |
230 次 |
| 最近记录: |