首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >枚举器类型与兼容类型

枚举器类型与兼容类型
EN

Stack Overflow用户
提问于 2015-12-11 10:19:39
回答 1查看 108关注 0票数 2

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

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-11 15:51:59

@Lundin评论上扩展,这种方法是一致的,C常量(如'A' )具有int类型,而不是char类型。

在C中,实际上没有比int更小的原始常数。在可能的情况下,C倾向于将较小的类型推广到int。我怀疑它创造了一个更简单的编译器--这在20世纪70年代很重要。

通过允许enum的实例更小,它占用的空间更少,就像char可能比int小一样,就像往常一样。

代码语言:javascript
运行
复制
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);
}

样本输出

代码语言:javascript
运行
复制
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))

不评论这是一个很好的设计-只是解释我的理解为什么。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34221138

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档