gpt4 book ai didi

c++ - 检测我是否在 C++ 中的退出处理程序中

转载 作者:行者123 更新时间:2023-12-04 01:09:54 26 4
gpt4 key购买 nike

我想知道我是否在 atexit() 处理程序中。我正在寻找 std::uncaught_exceptions() 的道德等价物用于 exit() 调用。

我想这样做是为了让静态对象中的析构函数在 main() 函数返回时以一种方式运行,而在 exit() 时以另一种方式运行被称为。

我可以添加对 atexit() 的调用以设置我检查的 bool,但这会遇到排序问题。例如,这个:

#include <iostream>
#include <stdlib.h>

struct Setter {
static void set_in_at_exit() { in_at_exit = true; std::cout << "setting\n";}
Setter() { std::cout << "constructor\n"; atexit(set_in_at_exit); }
static bool in_at_exit;
};

bool Setter::in_at_exit = false;

struct A {
A() { static Setter s; }
~A() { if (Setter::in_at_exit) {
std::cout << "in at exit\n";
}
std::cout << "My destructor\n"; }
};

A a;

int main()
{
return 0;
}

产生:

constructor
My destructor
setting

这不是我想要的。析构函数不知道它在退出处理程序中。

最佳答案

[basic.start.main]
A return statement (8.6.3) in main has the effect of leaving the main function (destroying any objects withautomatic storage duration) and calling std::exit with the return value as the argument. If control flows off the end of the compound-statement of main, the effect is equivalent to a return with operand 0

所以不,你无法区分这两种情况,除非你以某种方式检测所有对 exit 所有 return 语句和最后一个的显式调用main 中右括号之前的行。

关于c++ - 检测我是否在 C++ 中的退出处理程序中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65202955/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com