根据C11标准草案N1539,C中的enum
具有以下语义(为简洁起见而编辑)
语义
3枚举器列表中的标识符声明为 类型为int 的常量,可能出现在任何地方 允许的。 [...]
4每个枚举类型应兼容 with char,有符号整数类型或无符号整数类型。该 类型的选择是实现定义的,但应该能够 表示枚举的所有成员的值。 [...]
C11§6.7.2.23-4
问题:如果所有单个枚举器都是int类型的常量,为什么enum
的兼容类型作为整体是实现定义的类型?为什么枚举器不具有相同的兼容类型?
答案 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))
不评论这是一个很好的设计 - 只是解释我对原因的理解。