Да, это законно. Кстати, вам на самом деле не нужны парены, _Atomic enum foo foo;
эквивалентно.
_Atomic
работает как другие классификаторы типов, например const
и volatile
.
enum foo foo;
atomic_store(&foo, BAR);
- ошибка clang . error: address argument to atomic operation must be a pointer to _Atomic type ('enum foo *' invalid)
. (Из Проводник компилятора Godbolt ).
Это просто странная реализация GCC, которую он компилирует даже без предупреждения, даже на -Wall
. Это, вероятно, следует изменить ...
Атомные встроенные элементы GCC подобно void __atomic_store_n (type *ptr, type val, int memorder)
принимают указатель на простой тип, не требуя _Atomic
.
C ++ 11 <atomic>
использует эти встроенные функции. Аналогично, в GCC C11 stdatomic.h
используется
#define atomic_store_explicit(PTR, VAL, MO) \
__extension__ \
({ \
__auto_type __atomic_store_ptr = (PTR); \
__typeof__ (*__atomic_store_ptr) __atomic_store_tmp = (VAL); \
__atomic_store (__atomic_store_ptr, &__atomic_store_tmp, (MO)); \
})
#define atomic_store(PTR, VAL) \
atomic_store_explicit (PTR, VAL, __ATOMIC_SEQ_CST)
(__extension__
для выражения-выражения GNU C, где x = {foo; bar;}
принимает значение bar
.)
Так что на самом деле ничего этого не требует, чтобы тип указателя имел _Atomic
.