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

时间:2016-08-02 15:32:39

标签: c++ exit

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

4 个答案:

答案 0 :(得分:8)

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

但请注意,在C ++中std::exit / exit(无论您如何获得其名称)确实存在一些未针对C库中的exit指定的行为。特别是,

  1. exit首先销毁与当前线程关联的具有线程存储持续时间的所有对象。
  2. 销毁具有静态存储持续时间的对象,并调用使用atexit注册的所有函数。
    • 如果其中一个引发了未捕获的异常,则会调用terminate
  3. 之后我们得到正常的C行为:
    • 如果打开的C流有未写入的数据,则会刷新它们,然后它们会被关闭。
    • 删除通过调用tmpfile创建的文件。
    • 控制权返回主机环境,返回成功或失败,具体取决于调用exit0EXIT_SUCCESS =&gt;成功,EXIT_FAILURE时传递的值} =&gt;失败,其他任何东西都是实现定义的。)
  4. 请特别注意,任何对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);。这样,所有局部变量都将被销毁(即,堆栈展开将发生),然后您将正常退出环境。

答案 1 :(得分:7)

exit(当使用C ++编译器时)通过标题stdlib.h从C标准库中“借用”。

std::exit是C ++标准库版本;在cstdlib中定义。

在C ++中你应该使用后者,但这两个函数完全相同。

答案 2 :(得分:1)

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

你通常不会&#39; 希望调用exit,因为这样做会终止程序而不运行本地和全局析构函数(仅atexit注册函数)。 有时(很少)这是你想要的,但通常不是 - 你想从main返回。

答案 3 :(得分:1)

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

之间没有区别

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

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