将函数声明为__attribute __(nothrow)和`throw()`之间有什么区别?

时间:2013-10-11 19:16:40

标签: c++ exception-handling

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

据我所知,两种变体都说编译器此函数不会抛出异常。但实现可能会有所不同

编译器如何使用此信息?

如果我在nothrow或throw()函数内部运行时抛出异常怎么办?这个异常会到达函数?函数会进一步传递异常还是会隐藏异常或其他东西?

1 个答案:

答案 0 :(得分:3)

有几点不同:

  1. __attribute__((...))语法是一个gnu编译器扩展,它不是完全可移植的,throw()是由C ++标准定义的。

  2. 如果我正确读取它,__attribute__((nothrow))告诉编译器它可以安全地假设函数不会引发异常,并且可能省略发出异常处理所需的一些代码(这是打开的)来电方)。另一方面,throw()隐含地捕获由所讨论的函数引起的所有异常,并且在通过首先调用意外的异常处理程序捕获某些内容时终止程序,该异常处理程序默认调用terminate()(这发生在被叫方身上。)

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

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