Как C17 хочет, чтобы я инициализировал свою атомику?
Стандарт C17 устарел ATOMIC_VAR_INIT
от stdatomic.h
Это означает, что он все еще поддерживает, но, скорее, не будет использоваться. Каков правильный неразрешенный способ инициализации атомов в C17?
То же, что и неатомарные типы:
atomic_int foo = 42;
Или что-то новое?
2 ответа
C17 позволяет нормально инициализировать атомики, используя обычную явную инициализацию:
atomic_int n = 42;
C17 буквально отбросил два слова "using ATOMIC_VAR_INIT" из предложения в 7.17.2.1.
На основании этого документа, раздел DR 454, использование макроса делает невозможным узнать, в каком состоянии находится переменная.
atomic_int guide1 = ATOMIC_VAR_INIT(42); /* known value(42); WHAT STATE? */
Но использование нормального назначения также не определено, как показано ниже.
atomic_int guide2; /* indeterminate value; indeterminate state */
atomic_int guide3 = 42; /* known value(42); indeterminate state */
Чтобы перевести вашу переменную в известное состояние, вы должны использовать static
или atomic_init
функция.
static atomic_int guide4; /* known value(0); valid state */
static atomic_int guide5 = 42; /* known value(42); valid state */
atomic_int guide6;
atomic_init(&guide6, 42); /* known value(42); initialized state */
Но это единственная информация, которую я смог найти.