0

我正在使用 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

4

2 回答 2

0

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

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

于 2017-08-15T07:19:54.133 回答
0

就我而言,这个问题只发生在调试模式下。作为追查问题的结果,在头文件中声明如下代码时也出现了同样的错误。类文件中声明的代码没有引起任何问题。通过删除头文件中声明的代码解决了该问题。

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

希望这可以帮助仍在努力解决此问题的人...

于 2020-12-23T10:17:52.723 回答