【问题标题】:Can I throw C++ exceptions from legacy C callbacks?我可以从旧的 C 回调中抛出 C++ 异常吗?
【发布时间】:2011-03-11 18:14:11
【问题描述】:

我有使用一些 C 库的 C++ 代码。 C 库采用 C 语言回调。我在我的 C++ 代码中编写了一个回调,现在我需要报告错误(但它返回 void)。我想知道是否可以从 C++ 代码中使用的 C 回调中抛出异常?

这对我来说很难理解。

谢谢,博达·赛多。

【问题讨论】:

    标签: c++ c callback legacy


    【解决方案1】:

    是的,您可以从 C++ 函数中抛出异常。但是,它只能被 C++ 代码捕获,因此不会在遗留库中处理。

    【讨论】:

    • 你的意思是说“来自你的 C 函数”吗?
    • 没有。如果抛出异常,那么函数就不是C了,是吗?
    • 好点。如果我从中抛出,是 C 回调还是 C++ 回调?
    • 如果你的回调属于 C++ 编译单元,那么你可以说它是 C++。
    【解决方案2】:

    是的,您应该可以这样做。但是,请记住,C 库很可能不是为了异常安全而编写的,因此您可能会使该库的某些结构处于某种不一致的状态。它完全取决于特定的库和特定的回调函数。如果不出意外,该库可能必须从一开始就考虑到该回调的 C++ 支持。

    【讨论】:

    • +1 好点,C 库可以在调用回调函数之前分配内存、打开文件或网络连接。如果你在那里抛出异常,那么库之后不会清理。
    • 感谢您的提示。我让它使用了一个全局变量,如果发生错误,它就会被设置。随后对该 C 回调函数的所有调用都将返回并且什么也不做。在库完成所有 C 调用之后,我回到我的 C++ 代码,我检查是否设置了这个全局变量,如果是,我报告错误。
    • 你的前两个陈述是相互矛盾的。 “是的,你应该可以的。” - 好的,很好。 “但是,请记住,C 库很可能不是为了异常安全而编写的,” - 哦,所以答案实际上是否定的。切勿在未知异常安全的代码中抛出异常。
    • @JeremyP:是的,如果您从未看过 C 库的代码,那么这些陈述是矛盾的。但如果你有,没有技术原因你不应该抛出异常。如果图书馆不是为接受它而设计的,那可能是个坏主意。 C 本身没有异常,但由于第三方扩展(例如 Windows 上的 SEH),某些 C 代码完全有可能被编写为异常安全的。
    • @Billy ONeal:我认为“可能导致内存和其他资源泄漏”算作技术原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-04
    相关资源
    最近更新 更多