将函数声明为 __attribute__(nothrow) 和 `throw()` 有什么区别

osg*_*sgx 4 c++ exception

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

据我了解,这两种变体都是说编译器该函数不会抛出异常。但具体实现可能会有所不同

编译器将如何使用这些信息?

如果我在 nothrow 或函数内部运行时抛出异常throw()并且该异常将上升到该函数怎么办?函数会进一步传递异常还是会隐藏异常或其他什么?

cma*_*ter 5

有几个区别:

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

  2. 如果我正确地阅读它,__attribute__((nothrow))则告诉编译器它可以安全地假设函数不会引发异常,并且可能会省略发出异常处理所需的一些代码(这是在调用方)。throw()另一方面,隐式捕获由相关函数产生的所有异常,并在捕获到某些内容时终止程序,方法是首先调用意外的异常处理程序,默认情况下会调用该处理程序terminate()(这发生在被调用方)。

就编程而言,throw()它更有用,因为它可以保护您的代码不被异常默默地跳过。当我处理一个使用异常的项目时,我会特别注意添加throw()到我编写的每个函数中。

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