首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以将C11 `_Atomic`关键字应用于枚举类型吗?

我可以将C11 `_Atomic`关键字应用于枚举类型吗?
EN

Stack Overflow用户
提问于 2019-03-05 19:58:08
回答 2查看 1.1K关注 0票数 5

如果我有一个类型

代码语言:javascript
复制
enum foo {
    FOO,
    BAR,
    BAZ,
};

然后,我可以声明那种类型的原子版本吗?

代码语言:javascript
复制
_Atomic(enum foo);

还是我必须使用例如atomic_int并转换atomic_load()的结果

以下程序不带警告地编译:

代码语言:javascript
复制
    #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;
    }

但也是如此:

代码语言:javascript
复制
    #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;
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-05 20:10:58

是的,所有数据类型都可以是原子的,并且不需要为此使用原子泛型函数。然后,使用这样一个对象的所有操作都是原子的。

对于第二个例子,编译器不发出警告是很奇怪的。在原子操作中使用非原子操作是违反约束的,所以编译器应该给您一个诊断。

票数 3
EN

Stack Overflow用户

发布于 2019-03-05 22:51:38

是的这是合法的。顺便说一句,你实际上不需要父母,_Atomic enum foo foo;是等价的。

_Atomic与其他类型限定符(如constvolatile )一样工作。

代码语言:javascript
复制
enum foo foo;
atomic_store(&foo, BAR);

是clang的一个错误。error: address argument to atomic operation must be a pointer to _Atomic type ('enum foo *' invalid)。(来自戈德波特编译器浏览器. )

GCC的实现只是一个怪癖,它在编译时甚至没有警告,甚至在-Wall也是如此。也许应该改变一下..。

GCC原子结构一样,void __atomic_store_n (type *ptr, type val, int memorder)使用指向普通类型的指针,而不需要_Atomic

C++11 <atomic>使用这些内置程序。类似地,GCC的C11 stdatomic.h使用

代码语言:javascript
复制
#define atomic_store_explicit(PTR, VAL, MO)                             \
  __extension__                                                         \
  ({                                                                    \
    __auto_type __atomic_store_ptr = (PTR);                             \
    __typeof__ (*__atomic_store_ptr) __atomic_store_tmp = (VAL);        \
    __atomic_store (__atomic_store_ptr, &__atomic_store_tmp, (MO));     \
  })

#define atomic_store(PTR, VAL)                          \
  atomic_store_explicit (PTR, VAL, __ATOMIC_SEQ_CST)

( __extension__用于GNU语句-表达式,其中x = {foo; bar;}的值为bar。)

因此,所有这些实际上都不要求指针类型具有_Atomic

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55010595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档