【发布时间】:2014-03-03 08:44:30
【问题描述】:
我正在使用 C API 编写一个共享库,但大多数代码都是用 C++ 编写的。 在某些地方我想抛出异常,但我不知道如果第三方开发人员想用纯 C 编写项目会发生什么。
当 C++ 共享库在纯 C 项目中引发异常时会发生什么?
【问题讨论】:
-
通常会有绑定到
terminate(),这取决于你的实际工具链。
标签: c++ c exception shared-libraries
我正在使用 C API 编写一个共享库,但大多数代码都是用 C++ 编写的。 在某些地方我想抛出异常,但我不知道如果第三方开发人员想用纯 C 编写项目会发生什么。
当 C++ 共享库在纯 C 项目中引发异常时会发生什么?
【问题讨论】:
terminate(),这取决于你的实际工具链。
标签: c++ c exception shared-libraries
不是一个好主意。你肯定会泄漏内存。
一个明智的选择是在你的 C++ 库中拥有一个捕获站点,它填充一个线程特定的错误信息对象,并重构每个接口函数以具有一个返回状态代码来表示已经生成了一个错误。 (参见 Microsoft 的组件对象模型 HRESULT 和 IErrorInfo)。然后,您提供函数来调用您的库以提取错误详细信息。
【讨论】:
如果 C++ 异常冒泡到 C 代码中,那么您将得到未定义的行为。这是因为每种语言中的堆栈框架对于彼此来说都是陌生的。 C++ 运行时将尝试将堆栈帧展开到 C 代码中,并假定堆栈帧和运行时是为 C++ 设置的,而实际上它是为 C 设置的。
如果幸运的话,您的应用会崩溃,您很快就会知道问题所在。如果你运气不好,它会持续一段时间,你会得到一些很难找到的错误!
【讨论】: