在静态库外抛出c++异常

Throwing C++ exceptions outside static library?

本文关键字:c++ 异常 静态      更新时间:2023-10-16

作为规则,异常不能传播模块边界,例如Herb suters在c++编码标准(第62项)中解释的那样。当使用不同的编译器或仅使用编译器设置编译时,可能会崩溃。

我可以理解的情况下,例如动态链接库的问题。但我想知道它是否也适用于静态库。静态库是上述规则意义上的模块吗?如果库是用其他编译器设置(例如对齐)编译的,如果静态库抛出异常并在应用程序中捕获,程序可能会崩溃吗?

一般来说,静态库必须由相同的编译器和相同的编译器设置来编译(大多数情况下),以便与可交付的(动态库或可执行库)兼容。

因此,您可以在静态库的边界之外抛出异常,因为它与编译器生成的一组.obj文件没有太大区别。显然,可以在不同的。obj模块之间抛出异常。编辑:

总结一下注释:

  1. 如果你使用与编译库相同的编译器和编译器设置,你只能使用静态库。
  2. 可以在使用相同编译器和编译器设置编译的模块之间抛出异常。
  3. 从1)和2),你可以抛出异常从一个静态库,因为,如果你正在使用它,这意味着你使用相同的编译器和编译器设置,因此你可以抛出异常。

Herb suters的描述也适用于静态库:

c++异常处理没有通用的二进制标准。不要允许异常在两段代码之间传播,除非您可以控制编译器和用于构建两者的编译器选项双方;否则,模块可能不支持兼容异常传播的实现。通常,这可以归结为到:不要让异常跨模块/子系统的边界传播。

这取决于Herb所说的"模块"是什么意思。而问题不是只关注异常;他们可以关注任何使用c++的东西接口。

当异常交叉翻译时肯定没有问题单元边界的源代码编译为相同的一部分组件。在组件之间,如果它们都是同一组件的一部分应用程序,并确保它们都是使用相同的编译器,相同的编译器选项,它可能是安全的,虽然在动态间交叉时可能会出现问题库,取决于库是如何加载的。(在一般来说,这只是Unix系统上的问题动态加载组件中符号的可见性为由传递给动态加载器的选项控制。)作为一般规则是:安排编译所有的应用程序使用相同的编译器和相同的编译器选项,而你在应用程序中应该没有实际问题(尽管您可能必须确保所有动态组件都是显式加载,至少在Unix下)。之间的"应用程序",您正在加载或被加载的地方"外国"软件,赫伯的限制远远不够。在练习在应用程序之间交叉的接口必须在c中定义,并且可能仍然有限制,取决于你的代码是如何加载的,以及其他动态的加载的组件正在使用

静态链接将消除关于如何链接的问题加载了库,但没有更改其他内容。