了解 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 字符类型 = 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
第 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
类型是一个例外,但作为无类型(或指针的任何类型),它被有意从图中排除。
const
、volatile
、restrict
和_Atomic
是类型限定符,与派生类型的类型说明符相反,不能递归应用。这些的任何组合都可以预先定义任何类型定义(只要它有意义)。因此,将它们包括在图表中会使其复杂化,同时不会引入任何合适的信息。明显的例外是_Atomic (type)
构造,它被视为原子类型的类型说明符——派生类型之一> 列在 C11 标准中。
【讨论】:
以上是关于了解 C11 类型层次结构的主要内容,如果未能解决你的问题,请参考以下文章