5.2.7. C++ 异常处理

RVCT 中完全支持 C++ 异常处理。 但是,在缺省情况下,编译器不支持此功能。 您必须使用 --exceptions 选项启用 C++ 异常处理。 有关详细信息,请参阅--[no_]exceptions

Note

Rogue Wave 标准 C++ 库是在启用 C++ 异常的情况下提供的。

您可以对异常表生成进行有限的控制。

运行时的函数展开

缺省情况下,可以在运行时展开使用 --exceptions 编译的函数。 有关详细信息,请参阅--[no_]exceptions函数展开 包括破坏 C++ 自动变量并恢复在堆栈帧中保存的寄存器值。 函数展开是通过发出描述要执行的操作的异常表实现的。

可以使用编译指示 #pragma exceptions_unwind#pragma no_exceptions_unwind 为特定函数启用或禁用展开。有关详细信息,请参阅编译指示--exceptions_unwind 选项设置此编译指示的初始值。

为函数禁用函数展开操作产生以下结果:

  • 在运行时无法通过该函数抛出异常,并且该抛出不会展开堆栈。 如果抛出语言为 C++,则会调用 std::terminate

  • 可以使用很小的异常表表示形式来描述函数,这可帮助智能链接器进行表优化。

  • 由于调用方和被调用方必须正确地进行交互,函数内联将受到限制。

因此,可以使用 #pragma no_exceptions_unwind,以一种不需要额外源代码装饰的方式强制禁止展开。

与此相反,在 C++ 中,空函数异常规范允许进行函数展开(包括受保护的函数),然后根据 ISO C++ 标准调用 std::unexpected()

Copyright © 2007 ARM Limited. All rights reserved. ARM DUI 0348AC
Non-Confidential