是否允许以下代码?
_Atomic(unsigned int) a = 1;
if (a == 0) {
}
C11规范(n1570)在6.3.2.1p2中说:
如果左值具有原子类型,则该值具有左值类型的非原子版本。
所以这似乎说没关系。
答案 0 :(得分:7)
不,这样的初始化不行。您必须使用ATOMIC_VAR_INIT
来初始化原子对象。从C11 7.17.2.1:
ATOMIC_VAR_INIT宏扩展为适合的标记序列 初始化一个类型的原子对象 初始化 - 与值兼容。具有自动的原子对象 未使用显式初始化的存储持续时间 ATOMIC_VAR_INIT最初处于不确定状态;然而 具有静态或线程局部的对象的默认(零)初始化 存储持续时间保证产生有效状态。
否则对象将处于有效状态,但“不确定”,因此您不知道它具有哪个值。