根据C11标准草案N1539,C中的enum
具有以下语义(为简洁而编辑)
语义 3枚举数列表中的标识符被声明为具有类型的int的常量,并且可以在允许的地方出现。..。 4每种枚举类型应与char、有符号整数类型或无符号整数类型兼容。类型的选择是实现定义的,但应该能够表示枚举的所有成员的值。..。C11§6.7.2.2 3-4
问题:如果所有单个枚举数都是int类型的常量,为什么enum
的兼容类型作为一个整体可以是实现定义的类型?为什么枚举数不具有相同的兼容类型?
发布于 2015-12-11 15:51:59
在@Lundin评论上扩展,这种方法是一致的,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))
不评论这是一个很好的设计-只是解释我的理解为什么。
https://stackoverflow.com/questions/34221138
复制相似问题