【发布时间】:2022-01-02 23:14:39
【问题描述】:
让我们有两个库:libA.a 和 libB.a。他们是有组织的。 libA.a 调用 libB.a 函数并为其自身提供回调。换句话说,以下调用堆栈是可能的:
#0 liba_callback()
#1 libb_function()
#2 liba_function()
libA.a 用-fexceptions 编译,libB.a 用-fno-exceptions 编译。
问题是:如果liba_callback() 抛出,会发生什么?我可以在liba_function() 处理这个吗?我可以通过没有异常编译的函数抛出异常吗?是否定义了这种行为?
【问题讨论】:
-
稍微回避一下这个问题:即使你能做到,也不应该因为分配的资源。鉴于 libB 不支持异常,它不会优雅地处理它们,不会调用清理代码并因此泄漏资源。
-
C++ 标准未定义该行为。异常是语言的一部分,因此不支持异常 (-fno-exceptions) 的编译器不符合语言定义。编译器可能有一些文档来解释在这种情况下会发生什么。