选择哪一个:退出还是返回? [复制]

Posted

技术标签:

【中文标题】选择哪一个:退出还是返回? [复制]【英文标题】:Which one choose: exit or return? [duplicate] 【发布时间】:2014-02-11 18:07:36 【问题描述】:

我知道returnexit() (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 状态值是 0EXIT_SUCCESSEXIT_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 来进行更多正常程序终止。

请注意,传递给exitreturn 使用的值具有某种特定于系统的含义。该值返回到调用环境。 0EXIT_SUCCESS 表示成功; EXIT_FAILURE 表示失败。 (EXIT_SUCCESSEXIT_FAILURE 是在 <stdlib.h> 中定义的宏,与定义 exit 函数的头相同)。

任何其他值都将具有系统特定的含义。特别是,有一些系统(特别是 VMS)exit(1) 表示成功,而不是失败。在类 Unix 系统上,1 表示失败,EXIT_FAILURE 将被定义为 1。

您可以将EXIT_SUCCESSEXIT_FAILUREreturnexit() 一起使用。

另一方面,如果您需要指定多种故障,EXIT_FAILURE 将不够用。在类 Unix 系统上,可能在 Windows 上,0 表示成功,1 表示或多或少的一般故障,而其他小的正整数表示其他类型的失败。如果您需要,请随意使用特定值;您可能不在乎您的程序可能无法在 VMS 上按预期运行。 (我会为您使用的各种退出值定义常量,并在文档中清楚地说明它们的全部含义。)同样,您可以使用exit()return,以更方便为准。

我在上面说过main() 中的exit(N)return N几乎是相同的。

main 在 C 中递归调用自身是合法的。如果你的程序在main中,但不在main的初始调用中,那么return会终止main的当前执行,但不会终止程序;这就像returnexit()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 1return 2)。我已经更新了我的答案;见第 7 段。 +1 表示atexit 段落。我以前从未考虑过这种行为差异。

以上是关于选择哪一个:退出还是返回? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

数据复制或 API 网关聚合:使用微服务选择哪一个?

选择哪一个:ASP.NET MVC 还是 RESTful WCF?

安卓系统的手机怎么使用粘贴板?就是连续复制好几次文字,然后一长按就供你选择,粘贴哪一个?😊

React 还是 Vue: 你应该选择哪一个Web前端框架?

React 还是 Vue: 你应该选择哪一个Web前端框架?

linux vi怎么编辑器删除多行与复制命令