枚举类型能被视为不安全吗?

5

我知道枚举类型enum的每个元素都有自己的整数值,因此我尝试了以下代码:

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

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

并且它确实有效。我进一步查看后发现,它与int具有相同的最小和最大限制(在INT_MAX之后,我开始遇到未定义行为)。那么,在这种情况下,enum是否比一组#define更好?尽管我可能是错误的。


2
如果你完全错误地使用任何东西,几乎所有东西都是不安全的。 - klutt
2
一般来说,当涉及到C语言时,“安全”这个词是一个非常相对的概念。 - klutt
1
@mkrieger1 和 @underscore_d,你们提供的链接非常有帮助,我能够看到尽管存在问题,enum仍然很重要,所以谢谢你们。 - mediocrevegetable1
1
它和这个 char s[10]; s[13]='x'; 一样不安全。这是否意味着数组不安全? - klutt
1
@klutt 是的,没错。我想最终一切都取决于程序员不要做蠢事。 - mediocrevegetable1
显示剩余7条评论
1个回答

3

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

如果您提高编译器的警告级别(例如:gcc -Wall -Wextraclang -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;

我在gccclang中尝试了-Wall -Wextra,但不幸的是它并没有产生警告。 - mediocrevegetable1
@mediocrevegetable1: 的确,-Wall -Wextra 不够用,但是 clang -Weverything 会有很多警告。 - chqrlie
啊,是的,我现在收到了警告。谢谢。 - mediocrevegetable1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接