次のコードは使用できますか?
_Atomic(unsigned int) a = 1;
if (a == 0) {
}
C11 仕様 (n1570) は 6.3.2.1p2 で次のように述べています。
左辺値がアトミック型の場合、値は左辺値の型の非アトミック バージョンを持ちます。
だから、これは大丈夫だと言っているようです。
いいえ、そのような初期化は問題ありません。ATOMIC_VAR_INIT
アトミックオブジェクトを初期化するためにを使用する必要があります。C11 7.17.2.1から:
ATOMIC_VAR_INITマクロは、値と初期化互換性のあるタイプのアトミックオブジェクトを初期化するのに適したトークンシーケンスに展開されます。ATOMIC_VAR_INITを使用して明示的に初期化されていない自動保管期間のアトミック・オブジェクトは、最初は不確定な状態にあります。ただし、静的またはスレッドローカルストレージ期間を持つオブジェクトのデフォルト(ゼロ)初期化は、有効な状態を生成することが保証されています。
そうしないと、オブジェクトは有効な状態になりますが、「不確定」であるため、オブジェクトの値がわかりません。
この状態はC17で変更され、で初期化する必要がなくなりましたATOMIC_VAR_INIT
。質問に示されているように初期化を行うことは問題なく、正しい方法です。
誰かが示唆したように、別の可能性はまだ動的初期化を行うことですが、atomic_init
どこでも古典的な初期化が確かに好まれます。