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

ᴜsᴇ*_*sᴇʀ 1 c return return-value exit

我知道returnexit()(链接)之间的区别,但我不知道在何时何地选择一个而不是另一个.例如,根据这个答案,我理解这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)

一般吗?

Kei*_*son 5

从内部main功能,exit(N)以及return N;非常几乎相同(见下文).

exit()终止程序的整个执行.return只是从当前函数返回.(我知道你说你知道区别,但我想完成).

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

请注意,传递给exit或使用的值return具有某种特定于系统的含义.该值将返回给调用环境.0EXIT_SUCCESS表示成功; EXIT_FAILURE表示失败.(EXIT_SUCCESS并且EXIT_FAILURE定义了宏<stdlib.h>,定义exit函数的标头).

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

您可以使用EXIT_SUCCESSEXIT_FAILURE使用returnexit().

另一方面,如果您需要指定多种类型的故障,EXIT_FAILURE则还不够.在类Unix系统上,可能在Windows上,0表示成功,1表示或多或少的通用故障,而其他小正整数表示其他类型的故障.如果您需要,请随意使用特定值; 您可能不在乎您的程序可能无法在VMS上按预期工作.(我定义常量为你使用各种出口值,并明确说出他们所有的文档里的意思.)同样,你可以使用exit()return,取其更方便.

我上面提到exit(N)return Nmain()几乎相同的.

在C中合法main地递归调用自身是合法的.如果你的程序在main,但不在初始调用中main,那么return将终止当前执行main,但不会终止程序; 它就像return对比exit()除了以外的任何功能main.main递归调用几乎总是一个坏主意,所以值得注意,但不值得担心.

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

  • @user:你不能以*完全*可移植的方式做到这一点.但对于大多数系统(当然包括Linux和其他类Unix系统,也可能包括Windows),`exit(1)`表示或多或少的通用故障,2或更高表示一些更具体的错误(例如,` grep`使用0表示匹配,1表示不匹配,2表示错误,例如丢失文件.`EXIT_FAILURE`可能等于1,但如果你需要特定的数值,只需写`exit(1)`,`exit(2)`等(或`return 1`,`return 2`).我已经更新了我的答案; 见第7段. (2认同)