4

是否允许以下​​代码?

_Atomic(unsigned int) a = 1;
if (a == 0) {

}

C11 规范 (n1570) 在 6.3.2.1p2 中说:

如果左值具有原子类型,则该值具有左值类型的非原子版本。

所以这似乎说没关系。

4

1 回答 1

7

不,这样的初始化是不行的。您必须使用ATOMIC_VAR_INIT来初始化一个原子对象。从 C11 7.17.2.1 开始:

ATOMIC_VAR_INIT 宏扩展为一个标记序列,适用于初始化与值兼容的类型的原子对象。未使用 ATOMIC_VAR_INIT 显式初始化的具有自动存储持续时间的原子对象最初处于不确定状态;但是,具有静态或线程本地存储持续时间的对象的默认(零)初始化保证产生有效状态。

否则,该对象将处于有效状态,但“不确定”,因此您不知道它具有哪个值。

这个状态已经随着 C17 的变化而改变,它取消了用ATOMIC_VAR_INIT. 现在按照问题中的说明进行初始化是可以的,而且是正确的方法。

正如有人建议的那样,另一种可能性仍然是使用 进行动态初始化atomic_init,但是无论您在哪里,都肯定首选经典初始化。

于 2013-03-10T07:49:24.630 回答