You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否穿过使用-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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 09:06:04