我们来思考个问题:
int a;
int a[3][4];
假如有两个定义,现在我们要想描述出标识符a的类型信息,我们会怎么做呢,
- 对于第一句代码:下面的Type类型中的categ置为一个数,即可表明它的类型了。
- 对于第二句代码:a不仅需要int信息,还有,它是指针信息,还有它是指向int * [3][4]的这些信息,这个仅仅Type类型中的成员是无法表述的了,因此需要最下面的typeDerivList类型,也就是复合类型(这里不是指结构体或者联合体),用来描述该标识符的更多信息。除了数组外,函数,指针,等也属于符合类型,有多个信息需要描述,因此,Type类型中的bty就是用来指向额外的结构体typeDerivList的。该结构体什么时候指向的呢,是在语义检测的时候,DeriveType函数实现的。
#define TYPE_COMMON \ //表示公有的类型,就是各种类型,都需要有这个成员的
int categ : 8; \
int qual : 8; \ //constant还是volatile
int align : 16; \
int size; \
struct type *bty; //如果有第二类型属性,该指针指向那个基类。如果是函数类型,则这个是返回值的类型
//最重要的,如果是指针变量,指针本身是int型,但是bty这个域就是指向的那个类型。举个例,int arr[3][4];
typedef struct type //要想描述arr的类型,
{
TYPE_COMMON
} *Type;
----------------------------------------------------------------------------------------------------
typedef struct typeDerivList
{
int ctor; // type constructor pointer / function / array
union
{
int len; // array size,例如 int arr[3]中的 3
int qual; // pointer qualifier,记录指针的限定符(例如” int * const ptr”中的 const)
Signature sig; // function signature,sig 用于记录函数形参列表的类型
};
struct typeDerivList *next;
} *TypeDerivList;
此外,的例子还有:
static const int *a, a3[5];
int fn(int aa);
它们都属于复合类型,因此需要TypeDerivList结构体的加持,才能充分描述出类型信息。
int * arr1[5];
int (*arr2)[5];
结合 CheckDeclarationSpecifiers 函数所得到的类型信息,遍历如图 4.4.7 中所示的由若
干个 struct TypeDerivList 对象构成的链表,我们就可构建起“第 2.4 节 C 语言的类型系统”
中介绍的类型结构,与此相关的代码如图 4.4.8 所示。
经过 DeriveType()函数的类型推导,我们会为 int * arr1[5]和 int (*arr2)[5]这两个声明分
别构建如图 4.4.9 所示的类型结构
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)