8

std::atomic を clang で使用しようとしています。ただし、ヘッダー ファイルのアトミック () をインクルードしようとすると、#include <atomic>「アトミックが見つかりません」というメッセージが表示されます。std=c++11 -stdlib=libc++コンパイル中に - を含めていることに注意してください。私は何が欠けていますか?

私が使用しているclangのバージョンは3.2です。

4

3 に答える 3

3

私が使用しているclangのバージョンは3.2です。

Clang は、 LLVM CXX Statusに従って、2 つの異なるバージョンにわたってアトミック サポートを追加しました。1 つ目は Clang 3.1 で、2 つ目は 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

Clang Language Extensionsで文書化されていないため、「私は思う」としか言えません。ただし、LLVM サイトの検索では表示されます: "cxx_atomic" site:llvm.orgcxx_atomic

CFE Users メーリング リストの未解決の質問もあります: std::atomic の可用性を確認する方法は?


コンパイル中に -std=c++11 -stdlib=libc++ を含めていることに注意してください。私は何が欠けていますか?

このために、Clang/LLVM C++ ランタイムの 1 つを使用している可能性があります。これは実際には C++03 ですが、C++11 のふりをしています。多くのコンパイラとプラットフォームをサポートしているため、過去に多くの問題を引き起こしました。

以下は、それが本当に C++11 ライブラリなのか、それとも Apple の偽の C++11 ライブラリの 1 つなのかを確認するために、Jonathan Wakely が作成を手伝ってくれたテストです。

// 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
于 2016-05-03T01:47:43.980 に答える