能否穿过使用-fno-exceptions编译的函数抛出C++异常?
C++跨不同异常编译参数库的异常抛出问题解答
核心结论
1. 异常能否被liba_function捕获?
- 主流x86/ARM平台的GCC、Clang编译器环境下,如果
libb_function内部没有定义带非平凡析构函数的C++栈对象(比如libB.a是纯C编译的静态库的情况),liba_callback抛出的异常可以正常被liba_function的catch块捕获。 - 如果
libb_function内部存在带非平凡析构的C++栈对象,异常穿过时不会触发这些对象的析构,会出现资源泄漏,捕获行为也可能出现不可预期的异常。
2. 异常可以穿过用-fno-exceptions编译的函数抛出吗?
- 编译器的
-fno-exceptions参数的作用仅为禁止当前编译单元内编写throw/try/catch相关的异常语法代码,不会主动阻断异常的栈展开流程,只要满足上面提到的前提条件,异常可以正常穿过该编译单元的函数。
3. 该行为是否属于C++标准定义的合法行为?
- 不属于。C++标准没有对
-fno-exceptions这类编译器自定义的编译参数做任何行为约束,跨异常编译参数的异常抛出属于编译器扩展范畴,没有标准层面的合法性保证,不同编译器、不同版本、不同编译配置下的行为可能存在差异,生产环境不建议依赖该特性。
内容的提问来源于stack exchange,提问作者ivaigult
相关产品推荐
相关产品推荐

