使用exit()函数


99

我想知道如何以及何时可以使用exit()本书中的程序之类的功能:

#include<stdio.h>

void main()
{
    int goals;
    printf("enter number of goals scored");
    scanf("%d",&goals);

    if(goals<=5)
        goto sos;
    else
    {
        printf("hehe");
        exit( );
    }
    sos:
    printf("to err is human");
}

当我运行它时,它显示错误:调用未定义的函数exit()

另外,我想知道如何创建一个选项来关闭程序运行所在的窗口?例如,我制作了一个菜单驱动程序,其中包含多个选项,其中一个选项是“退出菜单”。我该如何退出程序(即关闭窗口)?


8
如果需要答案,请设置代码格式和问题格式,以便人们阅读。而且不要喊!

3
代码格式是一回事,但这写得不好。您不想要像这样的答案,对吗?
科比2010年

53
oy!Gotos退出?我的眼睛!他们燃烧!
凯尔(Kyle)2010年

8
我不是C专家,也不能毫不费力地写它,所以我对此也许是错的。。。但是我建议你把那本书扔掉吗?在C中使用goto就像...就像...我不知道。如果您现在对不起,他们想出了如何在厨房里*隐藏*的门...
Bobby 2010年

8
好吧,goto在C中仍然是有效的语法。它可能在样式上被拒绝,但仍然有效。void main()OTOH完全是错误的。一样exit();是错的,而忽略#include <stdlib.h>是错的。
wildplasser 2013年

Answers:



82

exit函数在stdlib标头中声明,因此您需要

#include <stdlib.h>

在您的程序顶部即可使用exit

还要注意,exit它带有一个整数参数,因此您不能像那样调用它exit(),而必须调用as exit(0)exit(42)。0通常表示您的程序成功完成,并且非零值用作错误代码。

还有预定义的宏EXIT_SUCCESSEXIT_FAILURE,例如exit(EXIT_SUCCESS);


3
+1不仅表示exit采用整数参数,还说明了为什么采用整数参数以及某些编译器要求使用explicit的原因#include <stdlib.h>
Variadicism 2015年

提到的预定义宏是在编译时定义的,不是吗?
carloswm85

11

exit(int code);被声明为,stdlib.h因此您需要

#include <stdlib.h>

另外:
-您没有的参数exit(),因此需要int提供一个。
-烧掉这本书,它使用goto的(对所有人(除Linux内核黑客以外)而言)是非常非常非常糟糕的。

编辑:
哦,还有

void main()

也是不好的,它是:

int main(int argc, char *argv[])

是的,它在书中写道,为了本书的完整性,您最好使用goto bt只是为了举例。
海妖

5
goto有时是正确的选择(Linux内核提供了许多示例,但这并不是唯一可以使用它的代码)。但是OP的例子显然不是这些情况之一,所以是的,那本书应该被烧掉了:)。
亚当·罗森菲尔德


7

exit()函数是一种函数类型,其返回类型不带参数。它是由stdlib头文件定义的。

您需要使用( exit(0) or exit(EXIT_SUCCESS))(exit(non-zero)exit(EXIT_FAILURE) )


4

以下示例显示了该exit()函数的用法。

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    printf("Start of the program....\n");
    printf("Exiting the program....\n");
    exit(0);
    printf("End of the program....\n");
    return 0;
}

输出量

程序启动...。
退出程序...。


2

您必须添加一行#include <stdlib.h>以包含该头文件,并且exit必须返回一个值,以便在中分配一些整数exit(any_integer)


2

除了将退出代码返回给父进程之外-

在UNIX中,我认为已经遗漏的一个重要方面是,在第一次调用时(以相反的顺序)exit()都是由atexit()调用注册的所有这些函数。

有关详细信息,请参考SUSv4。


1

在unix之类的操作系统上,exit属于系统调用组。系统调用是特殊调用,使用户代码(您的代码)能够调用内核代码。因此,退出调用会在将控制权还给OS之前执行一些特定于OS的清理操作,从而终止程序。

#include <stdlib.h>

// example 1
int main(int argc, char *argv){
  exit(EXIT_SUCCESS);
}

// example 2
int main(int argc, char *argv){
  return 0;
}

有些编译器会为您提供来自这两个示例的相同操作码,但有些则不会。例如,来自第一个函数的操作码将不包括任何类型的堆栈定位操作码,该堆栈定位操作码将像其他任何函数一样包含在第二个示例中。您可以编译并分解两个示例,然后您将看到差异。

您可以在代码的任何部分使用exit并确保该过程终止。不要忘记包括整数参数。



-3

错误的编程习惯。在C编程中,使用goto函数完全是“否”。
通过编写#include <iostream.h>使用exit()函数,还包括头文件stdlib.h 。还要记住,exit()函数接受一个整数参数。exit(0)如果程序成功完成,则使用此方法;如果exit(-1)程序有错误,则使用退出非零值作为参数的函数。


1
<iostream.h>特定于C ++,与<stdlib.h>实际需要的标头无关。唯一的便携式参数的exit功能是0EXIT_SUCCESSEXIT_FAILURE。使用任何非零值来表示故障特定于类UNIX系统(可能还有其他一些系统)。不要在可移植代码中依赖它。
基思·汤普森

-4

将其包含stdlib.h在标题中,然后abort();在要退出程序的任何位置调用。像这样:

switch(varName)
{
    case 1: 
     blah blah;
    case 2:
     blah blah;
    case 3:
     abort();
}

当用户输入时,开关会接受此操作,并将其交给第3种情况,您将在其中调用该abort函数。按下Enter键后,它将立即退出屏幕。


6
abort不是合适的事情在这里打电话,也不会调用atexit处理程序或刷新打开文件的缓冲区。它仅应用于异常程序终止,例如失败的断言等。对于正常程序终止,exit应使用。
亚当·罗森菲尔德

-6

使用process.h代替stdlib和iostream ...可以100%工作。


4
我不知道是什么过程。它当然不是标准C,并且不能在不提供它的系统上工作。所述<iostream>报头是特定于C ++; 问题是关于C.
基思·汤普森

1
这不是雅虎!答案是堆栈溢出。如果回答,则至少需要首先对其进行测试!
wizzwizz4 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.