__attribute__(nothrow)
将函数声明为和throw()
使用支持 gnu 扩展的 C++ 编译器(例如 Linux 上的 g++ 本身;C++03)有什么区别。
据我了解,这两个变体都是说编译器这个函数不会抛出异常。但实现可能不同
编译器将如何使用这些信息?
如果我在 nothrow 或throw()
函数内部运行时抛出异常,并且这个异常会上升到函数中怎么办?函数会进一步传递异常还是会隐藏异常或其他东西?
__attribute__(nothrow)
将函数声明为和throw()
使用支持 gnu 扩展的 C++ 编译器(例如 Linux 上的 g++ 本身;C++03)有什么区别。
据我了解,这两个变体都是说编译器这个函数不会抛出异常。但实现可能不同
编译器将如何使用这些信息?
如果我在 nothrow 或throw()
函数内部运行时抛出异常,并且这个异常会上升到函数中怎么办?函数会进一步传递异常还是会隐藏异常或其他东西?
有几个区别:
语法是 gnu 编译器__attribute__((...))
扩展,不完全可移植,throw()
由 C++ 标准定义。
如果我没看错,它__attribute__((nothrow))
会告诉编译器它可以安全地假设一个函数不会引发异常,并且可能会省略发出一些异常处理所需的代码(这是在调用者端)。throw()
另一方面,隐式捕获由相关函数产生的所有异常,并在捕获某些内容时通过首先调用意外异常处理程序来终止程序,默认情况下调用该异常处理程序terminate()
(这发生在被调用方)。
在编程方面,throw()
它更有用,因为它可以保护您的代码不被异常静默跳过。当我在一个使用异常的项目上工作时,我会在throw()
我编写的每一个函数中添加一点。
但是请注意,这两者都__attribute__((nothrow))
不会throw()
导致编译器实际检查是否不会引发异常。这很不幸,但 C++ 标准明确规定编译器不得在用throw()
.