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

23 浏览
0 Comments

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

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

enum Foo {
    Red = 0,
    Blue = 1
};
int main(void) {
    enum Foo bar = 2;
    return 0;
}

而且它...成功了。我进一步观察发现,enum似乎具有与int相同的最小和最大限制(在INT_MAX后我开始遇到未定义行为)。在这一点上,enum难道不比一组#define更好吗?不过,我也可能错了。

0
0 Comments

枚举变量是一个整数,其类型足够大以容纳枚举定义中定义的最大值,不一定是int类型,某些编译器上可能比int类型还大。你可以将任何与存储类型兼容的值存储在其中,运行时不会进行检查。

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

例如,当使用-Weverything参数调用clang时,会产生以下警告:

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;

我在gcc和clang中尝试了-Wall -Wextra。不幸的是,它没有产生警告。

确实,-Wall -Wextra是不够的,但clang -Weverything会报错。

啊是的,我现在收到警告了。谢谢。

原因:枚举变量的存储类型可能比int更大,所以可以存储与存储类型兼容的其他值,而不会在运行时进行检查。这可能导致一些潜在的问题。

解决方法:提高编译器的警告级别,例如使用clang -Weverything参数。这样可以在编译时发现潜在的问题,并及时修复。

0