【问题标题】:what is the difference between exit and std::exit in C++?C++ 中的 exit 和 std::exit 有什么区别?
【发布时间】:2016-12-08 01:33:47
【问题描述】:

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

【问题讨论】:

  • 一个存在于std 命名空间中,另一个不存在。你得到的取决于你包含的标题。
  • 两者完全相同。

标签: c++ exit


【解决方案1】:

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

但是,请注意,在 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);。这样,所有局部变量都将被销毁(即堆栈展开),然后您将正常退出环境。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      如果您之前声明过:using namespace std;std::exitexit 之间没有区别

      这个声明允许避免写前缀std。

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

      【讨论】:

        【解决方案4】:

        没有真正的区别。除非您在不同的作用域/命名空间中有名为 exit 的不同函数(如果您这样做了;好吧,我不知道该说什么 - 只是不要),exit()::exit()std::exit() 是同样的事情。

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

        【讨论】:

          猜你喜欢
          • 2010-09-28
          • 2010-12-20
          • 1970-01-01
          • 2014-10-08
          • 1970-01-01
          • 2012-03-14
          • 2013-03-30
          • 2017-04-14
          相关资源
          最近更新 更多