了解C11类型层次结构

时间:2013-12-08 01:43:05

标签: c types standards language-lawyer c11

我想完全理解C11语言的类型层次结构并以图形方式呈现它(树形图将是完美的)。该标准没有提供任何关于这个问题的数字 - 有30个点描述了它们之间的各种类型和关系。我想画它。

我的尝试始于获取ISO/IEC 9899:201x Committee Draft N1570并从文档第6.2.5节中提取所有必要的陈述。然后,我开始以树的形式重新安排知识。让我分两步介绍我的工作。

第1步:第1-15点

提取的知识(6.2.5节和指定生产中的点):

  • 1 类型 = 对象类型 + 功能类型;
  • 4 标准有符号整数类型 = signed charshort intintlong intlong long int;
  • 4 有符号整数类型 =标准有符号整数类型+ 扩展有符号整数类型;
  • 6 标准无符号整数类型 = _Boolunsigned charunsigned short intunsigned intunsigned long int,{{1} };
  • 6 无符号整数类型 =标准无符号整数类型+ 扩展无符号整数类型;
  • 7 标准整数类型 =标准有符号整数类型+标准无符号整数类型;
  • 7 扩展整数类型 =扩展有符号整数类型+扩展无符号整数类型;
  • 10 真实浮动类型 = unsigned long long intfloatdouble;
  • 11 复杂类型 = long doublefloat _Complexdouble _Complex;
  • 12 浮动类型 =真实浮动类型+复杂类型;
  • 14 基本类型 = long double _Complex +有符号整数类型+无符号整数类型+浮动类型;
  • 15 字符类型 = charcharsigned char

结果结构:

unsigned char

第2步:第16-24点

其余陈述:

  • 16 枚举类型;
  • 17 整数类型 = types object types function types basic types char sίgned integer types standard sίgned integer types signed char, short int, int, long int, long long int extended sίgned integer types unsίgned integer types standard unsίgned integer types _Bool, unsigned char, unsigned short int, unsigned int, unsigned long int, unsigned long long int extended unsίgned integer types floating types real floating types float, double, long double complex types float _Complex, double _Complex, long double _Complex standard integer types standard sίgned integer types standard unsίgned integer types extended integer types extended sίgned integer types extended unsίgned integer types character types char, signed char, unsigned char +有符号整数类型+无符号整数类型+枚举类型;
  • 17 真实类型 =整数类型+实际浮动类型;
  • 18 算术类型 =整数类型+浮动类型;
  • 20 派生类型 = 数组类型结构类型联合类型函数类型< / em>,指针类型原子类型;
  • 21 标量类型 =算术类型+指针类型;
  • 21 聚合类型 =数组类型+结构类型;
  • 24 派生的声明符类型 =数组类型+函数类型+指针类型。

最终的C11类型系统结构:

char

现在我需要减少结构(理想情况下是单个树)或者找到一种更难以表示关系的方法。我想为C11打字系统提供一张漂亮的笔记本。有什么想法吗?

1 个答案:

答案 0 :(得分:16)

通过删除/减少不太重要的节点并委托一些冗余/辅助信息通过其他方式呈现,可以简化问题第二步产生的C11类型的混乱结构。

我建议采用以下五步算法:

  1. 删除所有扩展整数类型(严格遵守假定的实现);
  2. 减少标准整数类型(因为它们不再分区类型);
  3. 对结构进行分组:
    1. 标量类型 vs 聚合类型子树对(表示为树),
    2. 基本类型 vs 派生类型子树对(由彩色区域表示),
    3. 真实类型派生的声明者类型(表示为这些的描述子区域),
    4. 字符类型(用不同的文字颜色表示);
  4. 非标准制作的应用:对象类型 = 标量类型 + 聚合类型;
  5. 补充缺少的联合类型原子类型对象类型
  6. 生成的C11类型系统摘要如下所示:

    C11 type hierarchy

    引入灰色笔划/区域以增加树的可读性。

    类型摘要不包括“类型声明完整性”的概念,因为它是在翻译单元中的特定点观察到的状态。在运行时,所有对象和函数都是完整类型的实例。 void类型是一个例外,但是,作为无类型(或指针的情况下的任何类型),它有意地从图中排除。

    constvolatilerestrict_Atomic类型限定符,与类型说明符相反对于派生类型,不能递归应用。这些的任何组合可以预先添加任何类型定义(只要它是有意义的)。因此,将它们包括在图中会使其复杂化,同时不会引入任何合适的信息。明显的异常使_Atomic (type)构造被认为是原型类型说明符 - 派生类型之一< / em>在C11标准中列出。