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

时间:2021-01-26 14:48:50

标签: c enums

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

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

int main(void) {
    enum Foo bar = 2;
    return 0;
}

它……有效。我进一步查看,我认为它具有与 int 相同的最小和最大限制(我在 INT_MAX 之后开始体验 UB)。在这一点上,一个 enum 不是比一组 #define 更好吗?不过,我在这里也很可能是错的。

1 个答案:

答案 0 :(得分:3)

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

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

例如 clang 在使用 -Weverything 调用时会产生这些警告:

test.c:7:20: warning: integer constant not in range of enumerated type 'enum Foo' [-Wassign-enum]
    enum Foo bar = 2;
                   ^
test.c:7:14: warning: unused variable 'bar' [-Wunused-variable]
    enum Foo bar = 2;