了解 C11 类型层次结构

Posted

技术标签:

【中文标题】了解 C11 类型层次结构【英文标题】:Understanding the C11 type hierarchy 【发布时间】:2013-12-25 06:41:46 【问题描述】:

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

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

第 1 步:第 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 字符类型 = charsigned charunsigned 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

第 2 步:第 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 打字系统制作一张漂亮的小抄。有什么想法吗?

【问题讨论】:

基本类型等都是对象类型。您似乎没有将它们视为对象类型的子类型。您还可以在图表中的多个点出现许多类型。 wchar_t 在这里适用吗? C11 3.7.3 @KrzysztofAbramowicz,你错过了我的观点。术语“整数类型”随后出现,因此从“标准整数类型”中省略“标准”会与这两个术语的名称发生冲突。术语“整数类型”本身在标准中是一个非常重要的术语,它的概念甚至在这里都没有体现。 尊敬的超级用户和版主, 这个问题已经长得太可怕了——对于这种格式来说太长了,但它不是太宽泛。我几乎准备好给它一个答案——它将由一个图表和一段文字组成,并将取代问题的“步骤 3”部分。结果:1.问题会更短,2.会得到回答。所以,请重新打开我的问题,给我一个机会来完成这个帖子——至少有 10 人在等待它。 @KrzysztofAbramowicz,很好的图表。至于你对_Atomic 的评论,这并不完全正确。它可以表现为两个非常接近的不同含义:作为限定符,因此您应该将其与其他限定符一起列出,以及作为类型说明符。后者是带有() 的那个,只有那个对应的原子类型才被视为派生类型,这听起来很奇怪。 【参考方案1】:

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

我为此提出以下五步算法:

    删除所有扩展整数类型(假定严格符合实现); 减少标准整数类型(因为它们不再分区类型); 对结构进行分组:
      标量类型聚合类型对子树(表示为树), 基本类型派生类型对子树(由彩色区域表示), 真实类型派生的声明类型(表示为这些类型的描边子区域), 字符类型(用不同的文字颜色表示);
    非标准产品的应用:对象类型 = 标量类型 + 聚合类型; 补充缺少的联合类型原子类型对象类型

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

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

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

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

【讨论】:

以上是关于了解 C11 类型层次结构的主要内容,如果未能解决你的问题,请参考以下文章

了解AutoCAD对象层次结构—— 文档

请帮助我了解 GAE 数据存储区中的实体层次结构

2017.0621.《计算机组成原理》-存储器层次结构

了解 VC++ 项目/解决方案资源管理器文件层次结构

了解AutoCAD对象层次结构 ——应用程序

了解,总结android开发框架