我正在使用托管 mbed C++ compiler 将 C++ 库移植到我的 mbed这基本上是 ARMCC,具有您无法真正更改的配置。他们决定的配置选项之一(出于某种未知原因)是不支持异常。所以 throw
和 catch
将产生编译器错误。
您如何准确无误地使用标准 C++ 库?我在我的图书馆中使用了一些载体。我怎么知道 push_back
函数是否真的成功了?是否有任何标准方法可以知道是否发生异常,或者它只是执行 exit(1)
或其他操作?
最佳答案
How exactly can you use the standard C++ library without exceptions? I use some vectors in my library. How do I know if the push_back function actually succeeded? Is there any standard way of knowing if an exception occurred or does it just do an exit(1) or something?
一旦您在 C++ 中禁用异常处理,您就进入了一个非常受限的领域。
一些标准库实现,如 Dinkumware 的实现,允许禁用异常。这是将宏 _HAS_EXCEPTIONS 定义为 0 的问题。STLPort 具有与 _STLP_USE_EXCEPTIONS=0 类似的约定。
但是,对于在禁用异常时标准库应该做什么没有标准定义。在大多数情况下,异常处理在 C++ 语言中根深蒂固。甚至 dynamic_cast
和 operator new/new[]
默认都会抛出,这些都不是库的特性。
即使对于不抛出的标准库实现,也缺乏明确的定义应该发生什么。如果序列 push_back
在为该序列分配更多内存的过程中抛出异常,应该发生什么?元素是不是根本没有插入?这些序列的标准接口(interface)肯定不会告诉我们何时会发生此类错误。
此外,许多 C++ 库通常会使用像 operator new 那样抛出的函数(而不是 nothrow 版本)。因此,一旦我们禁用异常,我们就会冒险进入许多未定义的行为领域。
我曾经不得不在一家禁止异常处理的公司工作,因为负责的高级程序员是过早的优化者,他们更喜欢 C 并认为 C++ 糟糕且效率低下(巧合的是,他们在团队非常倾向于将链表作为默认容器,这导致分析热点左右显示,因为为所有内容分配/取消分配的微小节点数量众多,但这是另一回事了)。
对于嵌入式系统,反对异常处理的论点可能会更强烈一些,但如果没有它,一般情况下确实很难依赖 C++。我认为在没有异常处理的情况下,你能做的最好的事情就是接受一种没有大量标准库部分的残缺形式的 C++,除非你想投入大量时间来寻找特定于你的特定标准库供应商的解决方法和技巧这可能比它的值(value)更麻烦。
关于c++ - 使用不支持异常的 C++ 编译器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9553225/