Aus*_*ser 5 c enums c11 stdatomic
如果我有一个类型
enum foo {
FOO,
BAR,
BAZ,
};
Run Code Online (Sandbox Code Playgroud)
然后我可以声明该类型的原子版本吗
_Atomic(enum foo);
Run Code Online (Sandbox Code Playgroud)
或者我必须使用egatomic_int并投射结果atomic_load()?
以下程序编译时不会出现警告:
#include <stdatomic.h>
#include <stdio.h>
enum foo {FOO, BAR, BAZ};
int main(void) {
_Atomic(enum foo) foo_a;
atomic_store(&foo_a, BAR);
enum foo val = atomic_load(&foo_a);
printf("%u\n", val);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但也是如此:
#include <stdatomic.h>
#include <stdio.h>
enum foo {FOO, BAR, BAZ};
int main(void) {
enum foo foo; // <---- non atomic
atomic_store(&foo, BAR);
enum foo val = atomic_load(&foo);
printf("%u\n", val);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
是的,所有数据类型都可以是原子的,并且不需要为此使用原子泛型函数。对此类对象的所有操作都是原子的。
对于第二个示例,编译器没有发出警告很奇怪。使用非原子操作进行原子操作是违反约束的行为,因此编译器应该为您提供诊断。
| 归档时间: |
|
| 查看次数: |
1415 次 |
| 最近记录: |