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

what is the difference between exit and std::exit in C++?

C++ 中的 exitstd::exit 有什么区别?我已经研究过了,但我找不到任何东西。

这两个代码有什么区别:

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);
}

exit(使用 C++ 编译器时)是通过 header stdlib.h.

来自 C 标准库的 "borrowed"

std::exit为C++标准库版本;在 cstdlib.

中定义

在 C++ 中你应该使用后者,但这两个函数做的事情完全一样。

没有真正的区别。除非你在不同的 scopes/namespaces 中有不同的名为 exit 的函数(如果你这样做;那么,我不知道该说什么 - 只是不要),exit()::exit()std::exit() 是一回事。

不过您通常 不想 调用 exit,因为这样做会在没有 运行 局部和全局析构函数的情况下终止程序(只是 atexit 注册函数)。 有时(很少)这就是你想要的,但通常不是 - 你想从 main return 改为

如果您之前声明过:using namespace std; std::exitexit

之间没有区别

此声明允许避免写前缀 std。

所以你也可以写cout而不是std::cout

它们是同一功能的两个名称,功能相同。

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

  1. exit首先销毁与当前线程关联的所有具有线程存储持续时间的对象。
  2. 具有静态存储持续时间的对象被销毁,并调用任何注册到atexit的函数。
    • 如果其中之一引发未捕获的异常,则调用 terminate
  3. 之后我们得到正常的 C 行为:
    • 如果有未写入的数据,打开的 C 流将被刷新,然后关闭。
    • 删除通过调用 tmpfile 创建的文件。
    • 控制返回到主机环境,返回成功或失败取决于调用 exit 时传递的值(0EXIT_SUCCESS => 成功,EXIT_FAILURE => 失败,其他的都是实现定义的)。

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

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