C ++中exit
和std::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);
}
答案 0 :(得分:8)
它们是同一个函数的两个名称,用于执行相同的操作。
但请注意,在C ++中std::exit
/ exit
(无论您如何获得其名称)确实存在一些未针对C库中的exit
指定的行为。特别是,
exit
首先销毁与当前线程关联的具有线程存储持续时间的所有对象。atexit
注册的所有函数。
terminate
。tmpfile
创建的文件。exit
(0
或EXIT_SUCCESS
=&gt;成功,EXIT_FAILURE
时传递的值} =&gt;失败,其他任何东西都是实现定义的。)请特别注意,任何对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::exit
和exit
此声明允许避免写入前缀std。
所以你也可以写cout
而不是std::cout