枚举可以被认为是不安全的吗?
枚举变量是一个整数,其类型足够大以容纳枚举定义中定义的最大值,不一定是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参数。这样可以在编译时发现潜在的问题,并及时修复。