首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >clang不支持std::atomic?

clang不支持std::atomic?
EN

Stack Overflow用户
提问于 2014-08-13 01:42:59
回答 3查看 4.5K关注 0票数 8

我正在尝试用clang来使用std::atomic。然而,每当我尝试包括头文件原子(#include <atomic>)时,我得到消息“原子找不到”。请注意,我在编译时包含了-std=c++11 -stdlib=libc++。我遗漏了什么?

我使用的clang版本是3.2。

EN

回答 3

Stack Overflow用户

发布于 2016-05-03 09:47:44

我使用的clang版本是3.2。

根据LLVM CXX Status的说法,Clang在两个不同的版本中添加了原子支持。第一个是Clang 3.1,第二个是Clang 3.2。

我认为您可以使用以下命令来检查它:

代码语言:javascript
复制
#if defined(__clang__)
#  if __has_feature(cxx_atomic)
#    define CLANG_CXX11_ATOMICS 1
#  endif
#endif

然后,在你的代码中:

代码语言:javascript
复制
#if CLANG_CXX11_ATOMICS
# include <atomic>
#endif

...

#if defined(CLANG_CXX11_ATOMICS)
# define MEMORY_BARRIER() std::atomic_thread_fence(std::memory_order_acq_rel)
#elif defined(__GNUC__) || defined(__clang__)
# define MEMORY_BARRIER() __asm__ __volatile__ ("" ::: "memory")
...
#endif

我只能说“我认为”,因为Clang Language Extensions没有记录cxx_atomic。然而,它出现在LLVM站点的搜索中:"cxx_atomic" site:llvm.org

还有一个关于CFE用户邮件列表的悬而未决的问题:How to check for std::atomic availability?

请注意,我在编译时包含了-std=c++11 -stdlib=libc++。我遗漏了什么?

为此,您可能使用了一个Clang/LLVM C++运行时,它实际上只是C++03,但伪装成C++11。它在过去给我带来了很多问题,因为我们支持许多编译器和平台。

Below is a test Jonathan Wakely helped us craft查看它是否真的是一个C++11库,或者是苹果的一个假C++11库:

代码语言:javascript
复制
// Visual Studio began at VS2010, http://msdn.microsoft.com/en-us/library/hh567368%28v=vs.110%29.aspx.
// Intel and C++11 language features, http://software.intel.com/en-us/articles/c0x-features-supported-by-intel-c-compiler
// GCC and C++11 language features, http://gcc.gnu.org/projects/cxx0x.html
// Clang and C++11 language features, http://clang.llvm.org/cxx_status.html
#if (_MSC_VER >= 1600) || (__cplusplus >= 201103L)
# define CXX11_AVAILABLE 1
#endif

// Hack ahead. Apple's standard library does not have C++'s unique_ptr in C++11. We can't
//   test for unique_ptr directly because some of the non-Apple Clangs on OS X fail the same
//   way. However, modern standard libraries have <forward_list>, so we test for it instead.
//   Thanks to Jonathan Wakely for devising the clever test for modern/ancient versions.
// TODO: test under Xcode 3, where g++ is really g++.
#if defined(__APPLE__) && defined(__clang__)
#  if !(defined(__has_include) && __has_include(<forward_list>))
#    undef CXX11_AVAILABLE
#  endif
#endif
票数 3
EN

Stack Overflow用户

发布于 2014-08-14 00:46:48

您是否指定了-I /path/to/your/c++ (或者,几乎等同于-cxx-isystem /path/to/your/c++),以便clang++可以找到它的位置?

如果您认为您不需要它们,请尝试clang++ -print-search-dirs进行确认。

票数 1
EN

Stack Overflow用户

发布于 2014-08-13 01:51:29

您的clang版本已过时。您应该从包管理器或http://clang.llvm.org/获取最新版本。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25270799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档