哪一个选择:退出还是退货?

时间:2014-01-21 22:11:31

标签: c return return-value exit

我知道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;
}

一般情况下?

3 个答案:

答案 0 :(得分:5)

main函数中,exit(N)return N;几乎完全相同(但请参见下文)。

exit()终止程序的整个执行。 return仅从当前函数返回。 (我知道你说你知道不同之处,但我想完成)。

如果你在main,你可以使用你喜欢的任何一个。选择是一种风格问题,我认为没有任何关于哪种风格最好的协议。您可以考虑使用exit,以防main中的代码稍后转移到其他功能中。我会使用return中的main来更多正常的程序终止。

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

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

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

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

我在上面说过,来自exit(N)的{​​{1}}和return N 几乎相同。

在{C}中,main()以递归方式调用自身是合法的。如果您的程序在main中,但在main的初始调用中没有,则main将终止return的当前执行,但不会终止该程序;对于main以外的任何函数,它就像returnexit()一样。递归地调用main几乎总是一个坏主意,所以值得注意,但不值得担心。

此外,main可用于注册在程序退出时自动调用的函数。无论函数是否因atexit()exit()而终止,都将调用任何此类函数。差异(这是一个令人难以置信的模糊之处)是returnexit()调用,main立即离开return。因此,如果您的main注册函数之一引用atexit()内的局部变量,那么如果您调用main,该变量仍然存在,但如果您执行exit()则不会声明。你必须不遗余力地做到这一点,并且没有充分的理由这样做,所以你几乎肯定不必担心这个特定的问题。

答案 1 :(得分:1)

如果在main中使用,两者都会做同样的事情,因此我会选择return 1,因为它更简单且无任何#include

当你想要从一个函数终止或者在你的exit例程之外时,

main很方便。

答案 2 :(得分:0)

这是你的选择。

标准C库启动代码可能如下所示:

exit(main(argc,argv))

无论如何,从主要的回归可能会打电话给退出。我个人的选择是从main返回退出代码,因为它不会掩盖代码的流程。