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

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)

Jen*_*edt 3

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

对于第二个示例,编译器没有发出警告很奇怪。使用非原子操作进行原子操作是违反约束的行为,因此编译器应该为您提供诊断。

  • 因为 `_Atomic` 看起来只是一个限定符,但实际上并不是限定符。规则是*短语“限定或非限定类型”,如果没有具体提及原子,则不包括原子类型。*因此,指向具有和不具有原子限定的类型的指针不兼容。 (2认同)