使用支持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()
声明的函数中引发错误。