【问题标题】:Use of exit() functionexit() 函数的使用
【发布时间】:2010-03-11 13:21:04
【问题描述】:

我想知道如何以及何时可以像我书中的程序一样使用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");
}

当我运行它时,它显示 ERROR: call to undefined function exit().

另外,我想知道如何创建一个选项来关闭程序运行的窗口?例如,我制作了一个菜单驱动程序,它有几个选项,其中一个是“退出菜单”。我怎样才能让它退出程序(即关闭窗口)?

【问题讨论】:

  • 如果您想要答案,请格式化您的代码和问题,以便人们阅读。不要大喊大叫!
  • 代码格式是一回事,但这写得不好。你不想要看起来像这样的答案,是吗?
  • 喂!转到并退出?我的眼睛!他们燃烧!
  • 我不是 C 专家,也不能毫无困难地写出来,所以我可能错了……但我可以建议你把那本书扔掉吗?在 C 中使用 goto 就像......就像......我不知道。如果你现在原谅我,他们想出了如何打开门 *hides.in.the.kitchen*...
  • 好吧,goto 在 C 中仍然是有效的语法。它可能会被 stylistically 否决,但它仍然有效。 void main() OTOH 只是完全错误。正如exit(); 是错误的,省略#include &lt;stdlib.h&gt; 是错误的。

标签: c


【解决方案1】:

试试man exit


哦,还有:

#include <stdlib.h>

int main(void) {
  /*  ...  */
  if (error_occured) {
    return (EXIT_FAILURE);
  }
  /*  ...  */
  return (EXIT_SUCCESS);
}

【讨论】:

  • 更具体地说,从控制台尝试“man 2 exit”。 c 文档非常详细。
  • 对,你是@Bertrand Marron
【解决方案2】:

尝试改用exit(0);exit 函数需要一个整数参数。别忘了#include &lt;stdlib.h&gt;

【讨论】:

  • man page 表示“` EXIT_SUCCESS 和 EXIT_FAILURE 的使用比使用 0 和一些非零值(如 1 或 -1)更便于移植(对于非 UNIX 环境)。`”
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    exit函数是在stdlib头中声明的,所以你需要有

    #include <stdlib.h>
    

    在程序顶部可以使用exit

    还要注意exit 接受一个整数参数,所以你不能像exit() 那样调用它,你必须调用exit(0)exit(42)。 0 通常表示您的程序成功完成,并且使用非零值作为错误代码。

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

    【讨论】:

    • +1 不仅提到了exit 接受一个整数参数,还解释了为什么它接受一个整数参数以及一些编译器需要显式的#include &lt;stdlib.h&gt;
    • 上面提到的预定义宏是在编译时定义的,不是吗?
    【解决方案5】:

    exit(int code);stdlib.h 中声明,所以你需要一个

    #include <stdlib.h>
    

    还有:
    - 您没有exit() 的参数,它需要int,因此请提供一个。
    - 烧掉这本书,它使用了goto,它(对于除 linux 内核黑客之外的所有人)很糟糕,非常,非常,非常糟糕。

    编辑:
    哦,还有

    void main()
    

    也很糟糕,它是:

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

    【讨论】:

    • 是的,书中写到,为了本书的完整性,你最好不要使用 goto bt,我只是给你一个例子......所以这本书没那么糟糕!
    • goto 有时是正确的做法(Linux 内核提供了很多这样的例子,但它不是唯一可以使用它的代码)。但是 OP 的例子显然不是这些案例之一,所以是的,那本书应该被烧掉:)。
    【解决方案6】:

    以下示例显示了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;
    }
    

    输出

    程序开始....
    退出程序....

    【讨论】:

      【解决方案7】:

      您必须添加带有#include &lt;stdlib.h&gt; 的行以包含该头文件 并且exit 必须返回一个值,因此在exit(any_integer) 中分配一些整数。

      【讨论】:

        【解决方案8】:

        除了返回一个退出码给父进程——

        在 UNIX 中,我认为被忽略的一个重要方面是,exit() 首先调用(以相反的顺序)所有那些由 atexit() 调用注册的函数。

        详情请参考SUSv4。

        【讨论】:

          【解决方案9】:

          在 unix 之类的操作系统上退出属于系统调用组。系统调用是允许用户代码(您的代码)调用内核代码的特殊调用。所以 exit 调用在将控制权返回给操作系统之前会执行一些操作系统特定的清理操作,它会终止程序。

          #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 并确保进程终止。不要忘记包含整数参数。

          【讨论】:

            【解决方案10】:

            写入头文件#include&lt;process.h&gt; 并将exit(); 替换为exit(0);。这肯定适用于 Turbo C;对于我不知道的其他编译器。

            【讨论】:

            • ` 是非标准的。 exit 函数在 &lt;stdlib.h&gt; 中声明。
            • 不能解决这个问题。您是否理解所提出的问题?
            【解决方案11】:

            糟糕的编程习惯。在 C 编程中,使用 goto 函数是完全不可以的。
            还通过编写#include &lt;iostream.h&gt;for 使用exit() 函数来包含头文件stdlib.h。还要记住 exit() 函数需要一个整数参数。如果程序成功完成,则使用exit(0);如果程序出错,则使用exit(-1) 或以任何非零值作为参数退出函数。

            【讨论】:

            • &lt;iostream.h&gt; 特定于 C++,与实际需要的标头 &lt;stdlib.h&gt; 无关。 exit 函数的唯一可移植参数是 0EXIT_SUCCESSEXIT_FAILURE。使用任何非零值来表示失败是特定于类 UNIX 系统(可能还有其他一些系统);不要在可移植代码中依赖它。
            【解决方案12】:

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

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

            当用户输入时,开关接受这个并将它交给你调用abort 函数的案例 3。按下回车键后会立即退出屏幕。

            【讨论】:

            • abortnot 适合在这里调用的东西,它不会调用 atexit 处理程序或刷新打开的文件缓冲区。它应该只用于异常程序终止,例如断言失败等。对于正常的程序终止,应使用exit
            【解决方案13】:

            使用 process.h 而不是 stdlib 和 iostream...它将 100% 工作。

            【讨论】:

            • 我不知道process.h是什么;它当然不是标准的 C,并且不会在不提供它的系统上工作。 &lt;iostream&gt; 标头特定于 C++;问题是关于 C 的。
            • 这不是 Yahoo!答案是堆栈溢出。如果你回答,你至少需要先测试一下!
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-05-15
            • 2012-07-09
            相关资源
            最近更新 更多