投掷静态库之外的C ++异常?(Throwing C++ exceptions outside st

2019-07-17 12:06发布

作为一个规则,例如在++香草SuttersÇ解释编码标准(项目62)的异常必须不会传播模块的边界。 当使用不同的编译器或只是编译器设置编译这可能会崩溃。

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

Answer 1:

一般来说,静态库必须通过相同的编译器和相同的编译器设置(大部分)要与交付(动态库或可执行文件)兼容的编译。

你可以的话,抛出一个静态库的边界之外的例外,因为它没有太大的区别不是一套的obj文件的生成你的编译器。 你明明可以抛出不同的.OBJ模块之间的异常。

编辑:

综上所述评论:

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


Answer 2:

香草Sutters'的描述也适用于静态库:

没有为C ++异常处理没有无处不在的二进制标准。 不允许例外的代码,除非你控制用来建立双方的编译器和编译器选项两片之间传播; 否则,模块可能不支持异常传播兼容的实现。 通常,这可以归结为:别让异常跨模块/子系统的边界传播。



Answer 3:

这取决于什么药草指“模块”。 而这些问题不仅涉及例外; 它们可以涉及使用C ++接口什么。

当然是有异常时的交叉编译为同一组件的一部分源翻译单元的边界没有问题。 组件之间,如果它们是同一应用程序的一部分,并且可以确保使用相同的编译器,用相同的编译器选项,它们都编译,它可能是安全的,虽然动态库之间穿越时,根据有可能出现问题库是如何加载。 (一般情况下,这只是在UNIX系统上,符号的动态加载组件的可见性是由传递到动态加载程序的选项控制的问题。)作为一般规则:安排都使用相同的编译应用程序的编译器和相同的编译器选项,你应该在应用程序中没有真正的问题(虽然你可能必须确保所有的动态部件的直接装载,至少在Unix)。 “应用”,你在哪里加载或“国外”软件加载之间,香草的限制做的还远远不够。 在实践中,如果您的应用程序之间跨接口必须用C语言来定义,可能仍存在限制,这取决于你的代码是如何加载和正在使用什么其他的动态加载组件。

静态链接将删除与问候图书馆是如何加载的问题,但改变不了什么东西。



文章来源: Throwing C++ exceptions outside static library?