首页 文章

枚举器类型与兼容类型

提问于
浏览
2

根据C11标准N1539草案,C中的 enum 具有以下语义(为简洁起见而编辑)

语义3枚举器列表中的标识符声明为具有int类型的常量,并且可以出现在允许的位置 . [...] 4每个枚举类型应与char,有符号整数类型或无符号整数类型兼容 . 类型的选择是实现定义的,但应能够表示枚举的所有成员的值 . [......]C11§6.7.2.23-4

Questions :如果所有单个枚举器都是int类型的常量,为什么 enum 的兼容类型整体上是实现定义的类型?为什么枚举器没有相同的兼容类型?

1 回答

  • 3

    扩展@Lundin comment,这种方法是 consistent ,其中C常量如 'A' ,类型为 int 而不是 char .

    在C中,确实没有类型的原始常量小于 int . C有利于在可能的情况下将较小的类型推广到 int . 我怀疑它是为了一个更简单的编译器 - 这在20世纪70年代很重要 .

    通过允许 enum 的实例更小,它占用更少的空间,就像通常那样 char 可能小于 int .

    int main(void) {
      char ch = 'A';
      enum EN {
        EN_a = 0, EN_b = 1
      };
      enum EN en;
    
      printf("sizeof (int):%zu\n", sizeof(int));
      printf("sizeof ch   :%zu (1 - by definition)\n", sizeof ch);
      printf("sizeof 'A'  :%zu (same as sizeof (int))\n", sizeof('A'));
      printf("sizeof en   :%zu (implementation defined)\n", sizeof en);
      printf("sizeof EN_a :%zu (same as sizeof (int))\n", sizeof EN_a);
    }
    

    样本输出

    sizeof (int):4
    sizeof ch   :1 (1 - by definition)
    sizeof 'A'  :4 (same as sizeof (int))
    sizeof en   :4 (implementation defined)
    sizeof EN_a :4 (same as sizeof (int))
    

    没有评论这是一个很好的设计 - 只是解释我对原因的理解 .

相关问题