【问题标题】:Can enums be considered unsafe? [duplicate]枚举可以被认为是不安全的吗? [复制]
【发布时间】:2021-01-26 14:48:50
【问题描述】:

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

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

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

而且它...有效。我进一步观察,我认为它与int 具有相同的最小和最大限制(我在INT_MAX 之后开始体验UB)。到那时,enum 不比一组#defines 更好吗?不过,我也很可能在这里错了。

【问题讨论】:

  • 如果你以完全错误的方式使用它,几乎任何东西都是不安全的
  • 一般来说,“安全”对于 C 来说是一个非常相对的术语。
  • @mkrieger1 和 @underscore_d 您的链接非常有用,我可以看到尽管存在问题,enums 仍然很重要,所以谢谢。
  • 我不像 char s[10]; s[13]='x'; 那样不安全,这是否使数组不安全?
  • @klutt 是的,这是真的。我想这一切最终都取决于程序员在某种程度上不是愚蠢的。

标签: c enums


【解决方案1】:

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

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

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

test.c:7:20:警告:整数常量不在枚举类型“enum Foo”[-Wassign-enum] 的范围内 枚举 Foo bar = 2; ^ test.c:7:14:警告:未使用的变量 'bar' [-Wunused-variable] 枚举 Foo bar = 2;

【讨论】:

  • 我在gccclang 中尝试了-Wall -Wextra。不幸的是,它不会产生警告。
  • @mediocrevegetable1:确实-Wall -Wextra 不够,但clang -Weverything 抱怨。
  • 啊,是的,我现在收到警告了。谢谢。
猜你喜欢
  • 2011-08-17
  • 2014-03-26
  • 2011-08-13
  • 2013-12-21
  • 2013-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多