【发布时间】: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的评论,这并不完全正确。它可以表现为两个非常接近的不同含义:作为限定符,因此您应该将其与其他限定符一起列出,以及作为类型说明符。后者是带有()的那个,只有那个对应的原子类型才被视为派生类型,这听起来很奇怪。
标签: c types standards language-lawyer c11