在C++中,Exit和std::Exit有什么不同?有什么不同、Exit、std

由网友(妄想温柔袭来)分享简介:在C++中exit和std::exit有什么区别?我研究过了,但什么也找不到。这两个代码有什么区别:1:if(SDL_Init(SDL_INIT_EVERYTHING) != 0){std::cout << "Error: Can't initialize the SDL ";exit(EXIT_FAILURE);...在C++中exitstd::exit有什么区别?我研究过了,但什么也找不到。

这两个代码有什么区别:

1:

if(SDL_Init(SDL_INIT_EVERYTHING) != 0)
{
    std::cout << "Error: Can't initialize the SDL 
";
    exit(EXIT_FAILURE);
}
进程的终止 exit 与 exit 的使用与区别

2:

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

推荐答案

它们是执行相同操作的同一函数的两个名称。

但是,请注意,在C++中,std::exit/exit(无论您如何找到它的名称)确实有一些在C库中没有为exit指定的行为。特别是,

exit首先销毁与当前线程关联的具有线程存储持续时间的所有对象。 具有静态存储时长的对象被销毁,并调用向atexit注册的任何函数。 如果其中一个引发未捕获的异常,则调用terminate。 之后,我们得到正常的C行为: 如果打开的C流有未写入的数据,则刷新它们,然后关闭它们。 通过调用tmpfile创建的文件将被删除。 将控制权返回到宿主环境,根据调用exit(0EXIT_SUCCESS=>Success,EXIT_FAILURE=>Failure,其他值由实现定义)返回Success或Failure。

请特别注意,本地对象不会被任何Exit调用销毁。

实际上,这意味着您应该真正忘记上面的所有内容,并简单地永远不要从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,而不是调用throw my_exit(whatever_value);。这样,所有局部变量都将被销毁(即将发生堆栈展开),然后您将正常退出环境。

阅读全文

相关推荐

最新文章