当前位置: 首页 > 知识库问答 >
问题:

在C++中exit和std::exit有什么区别?

宇文嘉勋
2023-03-14

1:

if(SDL_Init(SDL_INIT_EVERYTHING) != 0)
{
    std::cout << "Error: Can't initialize the SDL \n";
    exit(EXIT_FAILURE);
}

2:

if(SDL_Init(SDL_INIT_EVERYTHING) != 0)
{
    std::cout << "Error: Can't initialize the SDL \n";
    std::exit(EXIT_FAILURE);
}

共有1个答案

萧浩漫
2023-03-14

它们是做同样事情的同一个函数的两个名称。

但是请注意,在C++中std::exit/exit(不管您如何获得它的名称)确实有一些行为,而这些行为在C库中没有为exit指定。特别是,

  • exit首先销毁与当前线程关联的所有具有线程存储持续时间的html" target="_blank">对象。
  • 具有静态存储持续时间的
  • 对象将被销毁,并调用在atexit注册的任何函数。
    • 如果其中一个引发未捕获的异常,则调用Terminate
      null

    实际上,这意味着您应该真正忘记以上所有内容,并且永远不要从C++代码中调用exit/std::exit。虽然委员会显然认为与C代码的兼容性是他们需要把它留在标准中的一个足够强大的动机,但您当然不需要使用它--在几乎任何合理的正常情况下,您都不应该使用它。在退出作用域时销毁本地对象是C++中非常重要的一部分,因此像exit这样的函数消除了这种保证,只会带来一些麻烦。

    如果您需要类似于exit的行为,通常需要这样做:

    struct my_exit : public std::exception { 
        int value;
        my_exit(int value) : value(value) {}
    };
    
    int main() { 
        try {
            // do normal stuff
        }
    
        catch(my_exit const &e) {
            return e.value;
        }
    }
    

    然后,在代码的其余部分中,如果不调用exit,则抛出my_exit(whatever_value);。这样,所有的局部变量都将被销毁(即,堆栈展开将发生),然后您将执行正常的环境退出操作。

 类似资料:
  • 本文向大家介绍PHP中die()和exit()有什么区别?,包括了PHP中die()和exit()有什么区别?的使用技巧和注意事项,需要的朋友参考一下 die和exit之间没有区别,它们是相同的。 退出状态的PHP手册- 模具状态的PHP手册- 但是,差异很小,即解析器返回令牌所花费的时间。

  • 问题内容: 和Python和有什么不一样? 我尝试环顾四周,但没有在这些线上找到具体问题。如果已经回答,则链接就足够了。 问题答案: 0和1是退出代码。 意味着干净出口,没有任何错误/问题 表示存在一些问题/错误/问题,这就是程序退出的原因。 这不是特定于Python的,非常普遍。非零退出代码被视为异常退出,有时,错误代码指示问题所在。错误代码为零表示成功退出。 这对于其他程序,shell,调用方

  • 问题内容: 我一直在尝试弄清楚在Linux内部如何使用fork-exec机制。一切都按计划进行,直到一些网页开始使我感到困惑。 据说应该严格使用子进程,而不是从或简单或正常返回。 据我所知,Linux shell fork-execs执行每个外部命令。假设我上面所说的是正确的,那么结论是,这些外部命令或Linux shell内部发生的任何其他执行均不能正常返回! 维基百科和其他一些网页声称,我们只

  • 本文向大家介绍exit(0)与exit(1)两者之间的区别,包括了exit(0)与exit(1)两者之间的区别的使用技巧和注意事项,需要的朋友参考一下 在本文中,我们将了解exit和exit(1)之间的区别。 exit 它是便携式的。 它告知程序成功终止或完成。 它告知程序执行时终止而没有任何错误。 “ EXIT_SUCCESS”宏用于返回代码0。 可以将“ EXIT_SUCCESS”定义为标准零

  • 退出当前线程或(如果脚本不是持续运行的且不包含热键时)整个脚本。 Exit [, ExitCode] 参数 ExitCode 一个介于 -2147483648 和 2147483647 之间的整数 (可以为 表达式), 在脚本退出时返回给它的调用者. 此代码可以被任何调用脚本的程序访问, 例如另一个脚本 (使用 RunWait) 或批处理 (.bat) 文件. 如果省略,则 ExitCode 默认

  • 描述 (Description) 此函数评估EXPR,退出Perl解释器,并返回值作为退出值。在退出之前,始终运行脚本(和导入的包)中定义的所有END {}块。 如果省略EXPR,则解释器以值0退出。不应该用于退出子例程; 使用eval和die或使用return。 语法 (Syntax) 以下是此函数的简单语法 - exit EXPR exit 返回值 (Return Value) 此函数不返回