枚举可以被认为是不安全的吗?

med*_*le1 5 c enums

因为我知道 an 的每个元素enum都有自己的整数值,所以我尝试了以下方法:

enum Foo {
    Red = 0,
    Blue = 1
};

int main(void) {
    enum Foo bar = 2;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它......有效。int我进一步观察,我认为它具有与(我在 UB 之后开始体验 UB )相同的最小和最大限制INT_MAX。那么,a 不就enum比一组#defines 更好吗?不过,我在这里也很可能是错的。

chq*_*lie 3

变量是一个enum整数,其类型对于定义中定义的最大值而言足够大enum,不一定int且可能大于int某些编译器。您可以将 int 存储为与存储类型兼容的任何其他值,在运行时不执行任何检查。

如果您提高编译器的警告级别(例如:gcc -Wall -Wextraclang -Weverything),您可能会收到有关该值与目标 的所有定义的枚举常量不同的警告enum

例如,当使用以下命令调用时,clang-Weverything会产生这些警告:

test.c:7:20:警告:整数常量不在枚举类型“enum Foo”的范围内[-Wassign-enum]
    枚举 Foo bar = 2;
                   ^
test.c:7:14:警告:未使用的变量“bar”[-Wunused-variable]
    枚举 Foo bar = 2;