我尝试使用clang 3.6.1在FreeBSD 10.1 Release上使用C
中的原子,但是当我尝试在ATOMIC_FLAG_INIT
变量上使用atomic_flag
编译程序时在struct
我得到error: expected expression
。
这是我正在尝试编译的程序。
#include <stdio.h>
#include <stdatomic.h>
struct map
{
atomic_flag flag;
};
int main(void)
{
struct map *m = malloc(sizeof(struct map));
m->flag = ATOMIC_FLAG_INIT;
free(m);
return 0;
}
我可以在atomic_flag
之外使用structs
,如下例所示,但不能在structs
中使用,那么如何在C
structs
中使用原子变量?
#include <stdio.h>
#include <stdatomic.h>
int main(void)
{
atomic_flag flag = ATOMIC_FLAG_INIT;
return 0;
}
答案 0 :(得分:5)
atomic_flag
没有您可以分配或读取的值,但只有内部状态。
与atomic_flag
交互的唯一方法是为其定义的两个函数(如果算上_explicit
版本,则为四个函数)。对于您通过malloc
获得对象的情况,该标志处于&#34;不确定状态&#34; (C11的7.17.8 p4)。您可以通过应用两个函数之一将其置于已知状态,即使用atomic_flag_clear
将其设置为&#34; clear&#34;状态,或使用atomic_flag_test_and_set
将其设置为&#34; set&#34;状态。
在使用atomic_flag_clear
分配后立即使用malloc
相当于使用ATOMIC_FLAG_INIT
初始化变量。
答案 1 :(得分:-1)
atomic_flag
)的 ATOMIC_FLAG_INIT
未定义且此原子数据类型没有存储&amp;加载函数,所以编译器做得很好呻吟。
此外,你甚至没有为结构分配内存,只是在堆栈上创建了一个指针。