在静态库之外抛出C++异常?

Kit*_*sto 9 c++ exception static-libraries

通常,异常不得传播模块边界,例如Herb Sutters C++编码标准(第62项)中所述.使用不同的编译器或仅编译器设置编译时,这可能会崩溃.

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

Ale*_*lex 11

通常,静态库必须由相同的编译器和相同的编译器设置(大多数)编译,以与可交付物(动态库或可执行文件)兼容.

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

编辑:

总结评论:

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


bil*_*llz 5

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

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