【问题标题】:g++ can't override exit functiong++ 不能覆盖退出函数
【发布时间】:2018-11-29 03:45:14
【问题描述】:

我有一个 c++ 程序,我想编译出 std::exit 并使用我自己的,即通过:

-Dexit=myExit

但是,我遇到了这个问题:

In file included from /usr/include/c++/7/ext/string_conversions.h:41:0,
                 from /usr/include/c++/7/bits/basic_string.h:6352,
                 from /usr/include/c++/7/string:52,
                 from /usr/include/c++/7/bits/locale_classes.h:40,
                 from /usr/include/c++/7/bits/ios_base.h:41,
                 from /usr/include/c++/7/ios:42,
                 from /usr/include/c++/7/istream:38,
                 from /usr/include/c++/7/sstream:38,
                 from tests/helpers.h:4,
                 from tests/helpers.cpp:1:
/usr/include/c++/7/cstdlib:146:11: error: ‘::exit’ has not been declared
   using ::exit;

我在 virtualBox 上运行它:Ubuntu 18.04 / 18.10 / Debian 10

【问题讨论】:

  • 谁告诉你这是可以在 C++ 中执行的有效操作?
  • @Brian stackoverflow.com/questions/14199689/… 我也有它在 macOS 中工作,但不幸的是我在 linux 中确实需要它
  • 最好的办法就是把源代码改成直接调用myExit
  • @Cornstalks 在我的情况下不是一个选项,我必须能够在编译时做到这一点

标签: c++ g++ clang


【解决方案1】:

您可以使用atexit 注册自己的函数以在程序退出时执行,而不是自己覆盖exit,这是非标准且有风险的。

atexit 接受一个函数指针参数(void (*func)(void)),并将该函数注册为由exit 执行(有关参考,请参见glibc exit.c source code)。

使用这种方法,您可以注册多个要在退出时执行的函数,此外,atexit 行为在 C++ 标准中得到了很好的定义。

有关示例和文档,请参阅:

【讨论】:

  • 不幸的是,与其在退出时运行“额外”代码,我更希望函数退出而不是抛出一个可以被捕获的异常。从 atexit 注册器引发异常仍然会导致程序终止。
  • @jajabarr 你能解释一下,异常会在哪里被捕获?你在一些特殊的环境下运行吗?我认为 C++ 运行时不允许在退出时出现异常。
猜你喜欢
  • 2018-04-12
  • 2021-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-25
  • 2021-12-09
  • 1970-01-01
  • 2019-01-26
相关资源
最近更新 更多