我正在研究一个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
答案 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
希望这能帮助那些仍在努力解决这个问题的人......