使用支持gnu扩展的C++编译器时,将函数声明为__attribute__(nothrow)throw()有什么区别(例如,Linux上为g++本身; C++ 03)。

据我了解,这两种变体都表示编译器此函数不会引发异常。但是实现可能有所不同

编译器将如何使用此信息?

如果我在nothrow或throw()函数中运行时抛出异常怎么办,并且此异常将由该函数决定,该怎么办?函数会进一步传递异常,还是会隐藏异常或其他东西?

最佳答案

有几个区别:

  • __attribute__((...))语法是gnu编译器扩展,不是完全可移植的,throw()由C++标准定义。
  • 如果我没看错,__attribute__((nothrow))告诉编译器它可以安全地假定一个函数不会引发异常,并且可以省略发出一些异常处理所需的代码(这在调用方)。另一方面,throw()隐式捕获由所讨论的函数引起的所有异常,并通过首先调用意外的异常处理程序(默认情况下调用terminate())来捕获程序时终止程序(这种情况发生在被调用方)。

  • 在编程方面,throw()更为有用,因为它可以保护您的代码免于被异常静默跳过。当我处理使用异常的项目时,我要指出要向我编写的每个函数中添加throw()

    但是请注意,__attribute__((nothrow))throw()都不会导致编译器实际检查是否可以引发任何异常。这是很不幸的,但是C++标准明确表示编译器不得在使用throw()声明的函数中引发错误。

    09-11 19:34
    查看更多