当使用支持gnu扩展的C ++编译器时,将函数声明为__attribute__(nothrow)
和throw()
之间的区别是什么(例如,Linux上的g ++本身; C ++ 03)。
据我所知,两种变体都说编译器此函数不会抛出异常。但实现可能会有所不同
编译器如何使用此信息?
如果我在nothrow或throw()
函数内部运行时抛出异常怎么办?这个异常会到达函数?函数会进一步传递异常还是会隐藏异常或其他东西?
答案 0 :(得分:3)
有几点不同:
__attribute__((...))
语法是一个gnu编译器扩展,它不是完全可移植的,throw()
是由C ++标准定义的。
如果我正确读取它,__attribute__((nothrow))
告诉编译器它可以安全地假设函数不会引发异常,并且可能省略发出异常处理所需的一些代码(这是打开的)来电方)。另一方面,throw()
隐含地捕获由所讨论的函数引起的所有异常,并且在通过首先调用意外的异常处理程序捕获某些内容时终止程序,该异常处理程序默认调用terminate()
(这发生在被叫方身上。)
在编程方面,throw()
更有用,因为它可以保护您的代码免于被异常默默跳过。当我处理使用异常的项目时,我强调要为我写的每个函数添加throw()
。
但请注意,__attribute__((nothrow))
和throw()
都不会导致编译器实际检查是否可以抛出异常。这是非常不幸的,但C ++标准明确表示编译器不得在使用throw()
声明的函数中抛出一个错误。