Как 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 */

Но это единственная информация, которую я смог найти.

Другие вопросы по тегам