我正在尝试使用带有clang的std :: atomic。但是,每当我尝试包含头文件atomic(#include <atomic>
)时,我都会收到消息“atomic not found”。请注意,我在编译时包括 - std=c++11 -stdlib=libc++
。我错过了什么?
我使用的clang版本是3.2。
答案 0 :(得分:1)
你的clang版本已经过时了。您应该从包管理器或http://clang.llvm.org/获取最新版本。
答案 1 :(得分:1)
您是否指定了-I /path/to/your/c++
(或几乎相当于-cxx-isystem /path/to/your/c++
),以便clang++
可以找到其位置?
如果您认为自己不需要,请尝试clang++ -print-search-dirs
进行确认。
答案 2 :(得分:1)
我使用的clang版本是3.2。
根据LLVM CXX Status,Clang在两个不同的版本中添加了原子支持。第一个是Clang 3.1,第二个是Clang 3.2。
我认为你可以使用以下方式检查它:
#if defined(__clang__)
# if __has_feature(cxx_atomic)
# define CLANG_CXX11_ATOMICS 1
# endif
#endif
然后,在您的代码中:
#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
我只能说“我认为”,因为cxx_atomic
未记录在Clang Language Extensions。但是,它会在搜索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库,或Apple的假C ++ 11库之一:
// 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