31 Atomic operations library [atomics]

31.12 C compatibility [stdatomic.h.syn]

The header <stdatomic.h> provides the following definitions:
template<class T> using std-atomic = std::atomic<T>; // exposition only #define _Atomic(T) std-atomic<T> #define ATOMIC_BOOL_LOCK_FREE see below #define ATOMIC_CHAR_LOCK_FREE see below #define ATOMIC_CHAR16_T_LOCK_FREE see below #define ATOMIC_CHAR32_T_LOCK_FREE see below #define ATOMIC_WCHAR_T_LOCK_FREE see below #define ATOMIC_SHORT_LOCK_FREE see below #define ATOMIC_INT_LOCK_FREE see below #define ATOMIC_LONG_LOCK_FREE see below #define ATOMIC_LLONG_LOCK_FREE see below #define ATOMIC_POINTER_LOCK_FREE see below using std::memory_order // see below using std::memory_order_relaxed // see below using std::memory_order_consume // see below using std::memory_order_acquire // see below using std::memory_order_release // see below using std::memory_order_acq_rel // see below using std::memory_order_seq_cst // see below using std::atomic_flag // see below using std::atomic_bool // see below using std::atomic_char // see below using std::atomic_schar // see below using std::atomic_uchar // see below using std::atomic_short // see below using std::atomic_ushort // see below using std::atomic_int // see below using std::atomic_uint // see below using std::atomic_long // see below using std::atomic_ulong // see below using std::atomic_llong // see below using std::atomic_ullong // see below using std::atomic_char8_t // see below using std::atomic_char16_t // see below using std::atomic_char32_t // see below using std::atomic_wchar_t // see below using std::atomic_int8_t // see below using std::atomic_uint8_t // see below using std::atomic_int16_t // see below using std::atomic_uint16_t // see below using std::atomic_int32_t // see below using std::atomic_uint32_t // see below using std::atomic_int64_t // see below using std::atomic_uint64_t // see below using std::atomic_int_least8_t // see below using std::atomic_uint_least8_t // see below using std::atomic_int_least16_t // see below using std::atomic_uint_least16_t // see below using std::atomic_int_least32_t // see below using std::atomic_uint_least32_t // see below using std::atomic_int_least64_t // see below using std::atomic_uint_least64_t // see below using std::atomic_int_fast8_t // see below using std::atomic_uint_fast8_t // see below using std::atomic_int_fast16_t // see below using std::atomic_uint_fast16_t // see below using std::atomic_int_fast32_t // see below using std::atomic_uint_fast32_t // see below using std::atomic_int_fast64_t // see below using std::atomic_uint_fast64_t // see below using std::atomic_intptr_t // see below using std::atomic_uintptr_t // see below using std::atomic_size_t // see below using std::atomic_ptrdiff_t // see below using std::atomic_intmax_t // see below using std::atomic_uintmax_t // see below using std::atomic_is_lock_free // see below using std::atomic_load // see below using std::atomic_load_explicit // see below using std::atomic_store // see below using std::atomic_store_explicit // see below using std::atomic_exchange // see below using std::atomic_exchange_explicit // see below using std::atomic_compare_exchange_strong // see below using std::atomic_compare_exchange_strong_explicit // see below using std::atomic_compare_exchange_weak // see below using std::atomic_compare_exchange_weak_explicit // see below using std::atomic_fetch_add // see below using std::atomic_fetch_add_explicit // see below using std::atomic_fetch_sub // see below using std::atomic_fetch_sub_explicit // see below using std::atomic_fetch_or // see below using std::atomic_fetch_or_explicit // see below using std::atomic_fetch_and // see below using std::atomic_fetch_and_explicit // see below using std::atomic_flag_test_and_set // see below using std::atomic_flag_test_and_set_explicit // see below using std::atomic_flag_clear // see below using std::atomic_flag_clear_explicit // see below using std::atomic_thread_fence // see below using std::atomic_signal_fence // see below
Each using-declaration for some name A in the synopsis above makes available the same entity as std​::​A declared in <atomic>.
Each macro listed above other than _­Atomic(T) is defined as in <atomic>.
It is unspecified whether <stdatomic.h> makes available any declarations in namespace std.
Each of the using-declarations for intN_­t, uintN_­t, intptr_­t, and uintptr_­t listed above is defined if and only if the implementation defines the corresponding typedef name in [atomics.syn].
Neither the _­Atomic macro, nor any of the non-macro global namespace declarations, are provided by any C++ standard library header other than <stdatomic.h>.
Recommended practice: Implementations should ensure that C and C++ representations of atomic objects are compatible, so that the same object can be accessed as both an _­Atomic(T) from C code and an atomic<T> from C++ code.
The representations should be the same, and the mechanisms used to ensure atomicity and memory ordering should be compatible.