我知道枚举类型enum
的每个元素都有自己的整数值,因此我尝试了以下代码:
enum Foo {
Red = 0,
Blue = 1
};
int main(void) {
enum Foo bar = 2;
return 0;
}
并且它确实有效。我进一步查看后发现,它与int
具有相同的最小和最大限制(在INT_MAX
之后,我开始遇到未定义行为)。那么,在这种情况下,enum
是否比一组#define
更好?尽管我可能是错误的。
enum
变量是一个整数类型,其类型足够大以容纳在enum
定义中定义的最大值,不一定是int
类型,并且在某些编译器上可能比int
类型还要大。您可以将任何与存储类型兼容的值存储在其中,运行时不会执行检查。
如果您提高编译器的警告级别(例如:gcc -Wall -Wextra
或clang -Weverything
),则可能会收到有关目标enum
的值与所有已定义的枚举常量不同的警告。
例如,当使用-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
,但不幸的是它并没有产生警告。 - mediocrevegetable1-Wall -Wextra
不够用,但是 clang -Weverything
会有很多警告。 - chqrlie
enum
仍然很重要,所以谢谢你们。 - mediocrevegetable1char s[10]; s[13]='x';
一样不安全。这是否意味着数组不安全? - klutt