枚举器类型与兼容类型

时间:2015-12-11 10:19:39

标签: c enums language-lawyer

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

  

语义

     

3枚举器列表中的标识符声明为   类型为int 的常量,可能出现在任何地方   允许的。 [...]

     

4每个枚举类型应兼容   with char,有符号整数类型或无符号整数类型。该   类型的选择是实现定义的,但应该能够   表示枚举的所有成员的值。 [...]

     

C11§6.7.2.23-4

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

1 个答案:

答案 0 :(得分:3)

展开@Lundin comment,此方法一致,其中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))

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