理解C11类型层次结构

34
我想全面理解C11语言的类型层次结构并以图形方式呈现出来(树状图将是完美的)。标准未提供该问题的任何图表 - 仅有30个描述各个类型及其关系的要点。我想自己画出来。
我的尝试从获取ISO/IEC 9899:201x委员会草案N1570开始,并从文档的6.2.5节中提取所有必要的语句。然后,我开始以树的形式重新排列这些知识。让我分两步介绍我的工作。
第一步:第1-15点
提取的知识(6.2.5节内的点 + 指定产生式):
- 1 类型 = 对象类型 + 函数类型; - 4 标准有符号整数类型 = signed char, short int, int, long int, long long int; - 4 有符号整数类型 = 标准有符号整数类型 + 扩展有符号整数类型; - 6 标准无符号整数类型 = _Bool, unsigned char, unsigned short int, unsigned int, unsigned long int, unsigned long long int; - 6 无符号整数类型 = 标准无符号整数类型 + 扩展无符号整数类型; - 7 标准整数类型 = 标准有符号整数类型 + 标准无符号整数类型; - 7 扩展整数类型 = 扩展有符号整数类型 + 扩展无符号整数类型; - 10 实浮点类型 = float, double, long double; - 11 复合类型 = float _Complex, double _Complex, long double _Complex; - 12 浮点类型 = 实浮点类型 + 复合类型; - 14 基本类型 = char + 有符号整数类型 + 无符号整数类型 + 浮点类型; - 15 字符类型 = char, signed char, unsigned char。
结果如下:
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

第二步:第16-24点

剩下的语句:

  • 16 枚举类型
  • 17 整型 = char + 有符号整型 + 无符号整型 + 枚举类型;
  • 17 实型 = 整型 + 实浮点型;
  • 18 算术类型 = 整型 + 浮点型;
  • 20 派生类型 = 数组类型结构体类型联合类型函数类型指针类型原子类型
  • 21 标量类型 = 算术类型 + 指针类型;
  • 21 聚合类型 = 数组类型 + 结构体类型;
  • 24 派生声明类型 = 数组类型 + 函数类型 + 指针类型。

最终的C11类型系统结构:

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
real types
    integer 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
        enumeration  types
    real floating types
        float, double, long double
scalar types
    arithmetic types
        integer 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
            enumeration  types
        floating types
            real floating types
                float, double, long double
            complex types
                float _Complex, double _Complex, long double _Complex
    pointer types
derived types
    array types
    structure types
    unίon types
    function types
    pointer types
    atomic types
aggregate types
    array type
    structure type
derived declarator types
    array type
    structure type
    pointer type

现在我需要简化结构(理想情况下是一个单独的树形结构),或找到更巧妙的方式来表示关系。我想要为C11类型系统制作一张漂亮的速查表。有什么建议吗?


1
基本类型等都是对象类型。 您似乎没有将它们视为对象类型的子类型。 您的图表中还有许多类型出现在多个位置。 - Jonathan Leffler
1
这里适用 wchar_t 吗? C11 3.7.3 - chux - Reinstate Monica
1
@KrzysztofAbramowicz,你没有理解我的观点。术语“整数类型”在后面出现,并且从“标准整数类型”中省略“标准”会导致两个术语的名称冲突。仅使用“整数类型”这个术语在标准中非常重要,而且它的概念甚至还没有被表示出来。 - Jens Gustedt
1
亲爱的超级用户和版主们,这个问题已经变得非常长了——对于这种格式来说太长了,但它并不是太广泛了。我几乎准备好回答它了——它将包括一个单独的图表和一段文字,并将替换问题的“步骤3”部分。结果是:1.问题会更短,2.它将被回答。因此,请重新打开我的问题,并给我完成这个线程的机会——至少有10个人在等待着它。 - Krzysztof Abramowicz
1
@KrzysztofAbramowicz,好图。关于您对_Atomic的评论,这并不完全正确。它可以出现为两个不同的含义,而且非常接近:作为一个限定符,因此您应该将其与其他限定符一起列出;作为类型说明符。后者是带有()的那个,只有使用它才能将相应的原子类型视为派生类型,尽管这听起来很奇怪。 - Jens Gustedt
显示剩余9条评论
1个回答

17

第二步中产生的C11类型混乱的结构可以通过删除/减少较不重要的节点并将一些冗余/附属信息委托给其他方式呈现来简化。

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

  1. 删除所有扩展的整数类型(假定严格符合实现);
  2. 缩减标准整数类型(因为它们不再分割类型);
  3. 分组结构:
    1. 标量类型聚合类型子树对(表示为树),
    2. 基本类型派生类型子树对(由彩色区域表示),
    3. 实数类型派生声明符类型(表示为这些类型的笔画子区域),
    4. 字符类型(使用不同的文本颜色表示);
  4. 应用非标准制造: 对象类型 = 标量类型 + 聚合类型;
  5. 补充缺失的联合类型原子类型对象类型

生成的C11类型系统摘要如下:

C11 type hierarchy

灰色笔画/区域是为增加树的可读性而引入的。

类型摘要不包括“类型声明完整性”的概念,因为它是在特定点观察到的状态,在运行时,所有对象和函数都是完整类型的实例。 void 类型是一个例外,但作为无类型(或指针的任何类型)被有意地排除在图表之外。 constvolatilerestrict_Atomic类型限定符,与 派生类型类型说明符相反,不能递归应用。这些任意组合都可以在任何类型定义之前加上(只要它有意义)。因此,将它们包含在图表中将使其复杂化,而不引入任何有用的信息。明显的例外是 _Atomic(type) 结构,它被视为是 原子类型 中的一种 类型说明符——C11标准中列出的派生类型之一。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接