这段代码的行为定义良好吗?
#include <stdatomic.h>
const int test = 42;
const int * _Atomic atomic_int_ptr;
atomic_init(&atomic_int_ptr, &test);
const int ** int_ptr_ptr = &atomic_int_ptr;
printf("int = %d\n", **int_ptr_ptr); //prints int = 42
我将指向原子类型的指针分配给指向非原子类型的指针(类型相同)。以下是我对这个例子的想法:
该标准明确规定了以下的区别:const
, volatile
and restrict
预选赛来自_Atomic
预选赛6.2.5(p27)
:
本标准明确使用“原子的、合格的或
每当允许类型的原子版本时,都是非限定类型
以及类型的其他限定版本。词组
“限定或非限定类型”,没有具体提及原子,
不包括原子类型。
合格类型的兼容性也定义为6.7.3(p10)
:
为了使两个合格类型兼容,两者都应具有
兼容类型的相同限定版本;的顺序
说明符或限定符列表中的类型限定符确实
不影响指定类型。
结合上面引用的引文,我得出结论:原子类型和非原子类型是兼容类型。因此,应用简单分配规则6.5.16.1(p1)
(员工我的):
左操作数具有原子、限定或非限定指针
类型,并且(考虑左操作数的类型
左值转换后)两个操作数都是指向合格的
或不合格兼容类型的版本,以及指向的类型
左边有右边指向的类型的所有限定符;
所以我得出的结论是,行为是明确定义的(即使将原子类型分配给非原子类型)。
所有这些的问题在于,应用上述规则我们还可以得出这样的结论:将非原子类型简单赋值给原子类型也是明确定义的,这显然是不正确的,因为我们有一个专用的泛型atomic_store
的功能。
6.2.5p27:
此外,还有 _Atomic 限定符。 _Atomic 的存在
限定符指定原子类型。尺寸、表示形式和
原子类型的对齐不需要与原子类型的对齐相同
相应的非限定类型。因此,本标准明确
每当
允许类型的原子版本与其他限定版本一起使用
类型的版本。短语“合格或不合格类型”,
如果没有具体提及原子,则不包括原子类型。
我认为这应该清楚地表明原子限定类型是not被认为与它们所基于的类型的合格或不合格版本兼容。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)