C++ 中的 exit 和 std::exit 有什么区别?
what is the difference between exit and std::exit in C++?
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);
}
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::exit
和 exit
之间没有区别
此声明允许避免写前缀 std。
所以你也可以写cout
而不是std::cout
它们是同一功能的两个名称,功能相同。
但是请注意,在 C++ 中 std::exit
/exit
(无论您如何获得它的名称)确实有一些没有为 C 中的 exit
指定的行为图书馆。特别是,
exit
首先销毁与当前线程关联的所有具有线程存储持续时间的对象。
- 具有静态存储持续时间的对象被销毁,并调用任何注册到
atexit
的函数。
- 如果其中之一引发未捕获的异常,则调用
terminate
。
- 之后我们得到正常的 C 行为:
- 如果有未写入的数据,打开的 C 流将被刷新,然后关闭。
- 删除通过调用
tmpfile
创建的文件。
- 控制返回到主机环境,返回成功或失败取决于调用
exit
时传递的值(0
或 EXIT_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);
。这样,所有局部变量都将被销毁(即,将发生堆栈展开)并且然后您将正常退出环境。
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);
}
exit
(使用 C++ 编译器时)是通过 header stdlib.h
.
std::exit
为C++标准库版本;在 cstdlib
.
在 C++ 中你应该使用后者,但这两个函数做的事情完全一样。
没有真正的区别。除非你在不同的 scopes/namespaces 中有不同的名为 exit
的函数(如果你这样做;那么,我不知道该说什么 - 只是不要),exit()
,::exit()
和 std::exit()
是一回事。
不过您通常 不想 调用 exit
,因为这样做会在没有 运行 局部和全局析构函数的情况下终止程序(只是 atexit
注册函数)。 有时(很少)这就是你想要的,但通常不是 - 你想从 main
return 改为
如果您之前声明过:using namespace std;
std::exit
和 exit
此声明允许避免写前缀 std。
所以你也可以写cout
而不是std::cout
它们是同一功能的两个名称,功能相同。
但是请注意,在 C++ 中 std::exit
/exit
(无论您如何获得它的名称)确实有一些没有为 C 中的 exit
指定的行为图书馆。特别是,
exit
首先销毁与当前线程关联的所有具有线程存储持续时间的对象。- 具有静态存储持续时间的对象被销毁,并调用任何注册到
atexit
的函数。- 如果其中之一引发未捕获的异常,则调用
terminate
。
- 如果其中之一引发未捕获的异常,则调用
- 之后我们得到正常的 C 行为:
- 如果有未写入的数据,打开的 C 流将被刷新,然后关闭。
- 删除通过调用
tmpfile
创建的文件。 - 控制返回到主机环境,返回成功或失败取决于调用
exit
时传递的值(0
或EXIT_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);
。这样,所有局部变量都将被销毁(即,将发生堆栈展开)并且然后您将正常退出环境。