使用未声明的标识符' nothrow&#39 ;;你的意思是'扔掉'?记忆

时间:2017-08-15 02:31:39

标签: c++ xcode memory libstdc++ nothrow

我正在研究一个cpp代码,将一个应用程序从Windows移植到Mac。在Xcode中构建应用程序时,它会抛出错误说:

"Use of undeclared identifier 'nothrow'; did you mean 'throw'? memory"

这些错误在cpp标准库头中引发。

以下是错误堆栈描述:

/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/c++/4.2.1/memory:83:8: Use of undeclared identifier 'nothrow'; did you mean 'throw'?

/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/c++/4.2.1/string:48:10: In file included from /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/c++/4.2.1/string:48:

我在互联网上搜索但无法找到解决此问题的方法。任何建议都会有所帮助。为什么从系统头文件中抛出错误?

系统详细信息:

  • SDK是OSX 10.10。

  • 用于编译应用程序的编译器选项是C ++标准库:

    libc ++(支持C ++ 11的LLVM C ++标准版.C ++语言方言:GNU ++ 11.C ++编译器:Apple LLVM 6.0

2 个答案:

答案 0 :(得分:0)

函数的throw()规范在 11标准中已弃用,并在' 17标准中删除。如果clang不支持它,我的猜测是,这是开发人员的有意选择。部分,或者您正在以c ++ 17模式进行编译。

在现代c ++中要做的正确的事情是使用noexcept规范。 noexcept允许更有效的代码生成,因为它不必对抛出的异常执行RTTI,而是如果从noexcept声明的函数下面的调用框架抛出异常,则调用std :: terminate,短路由' 98标准指定的疯狂的std :: unexpected()机制。

答案 1 :(得分:0)

就我而言,此问题仅在调试模式下发生。 由于追查问题,在头文件中声明如下代码时出现同样的错误。类文件中声明的代码没有引起任何问题。 问题通过删除头文件中声明的代码解决。

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

希望这能帮助那些仍在努力解决这个问题的人......