Sun Studio 12:C 用户指南

6.12 兼容类型和复合类型

对于 K&R C,引用同一实体的两个声明可能是不同的;对于 ISO C 更是这样。ISO C 中使用的术语“兼容类型”表示“足够接近”的类型。本节描述兼容类型和“复合类型”(合并两种兼容类型而产生的结果)。

6.12.1 多个声明

如果只允许 C 程序声明每个对象或函数一次,则不需要兼容类型。链接(允许两个或更多声明引用相同实体)、函数原型和分别编译全部需要此功能。独立转换单元(源文件)具有与单个转换单元不同的类型兼容性规则。

6.12.2 分别编译兼容性

由于每个编译可能查看不同的源文件,因此独立编译中的大多数兼容类型规则实质上是结构化的:

6.12.3 单编译兼容性

当相同作用域内的两个声明描述相同的对象或函数时,这两个声明必须指定兼容类型。然后这两种类型合并为与这两种类型兼容的单个复合类型。后面将详细讨论复合类型。

兼容类型是递归定义的。底部为类型说明符关键字。规则规定,unsigned shortunsigned short int 相同,不带类型说明符的类型与带有 int 的类型相同。所有其他类型仅当派生它们的类型兼容时才为兼容类型。例如,如果限定符 const volatile 是相同的,且未限定基类型是兼容的,则两个限定类型是兼容的。

6.12.4 兼容指针类型

要使两种指针类型兼容,它们指向的类型必须兼容,并且必须对这两个指针进行相同的限定。考虑到指针的限定符在 * 之后指定,因此以下两个声明


int *const cpi;
int *volatile vpi;

声明指向相同类型 int 的两个以不同方式限定的指针。

6.12.5 兼容数组类型

要使两个数组类型兼容,它们的元素类型必须兼容。如果两个数组类型具有指定的大小,则它们必须匹配,即,不完全数组类型(请参见6.11 不完全类型)同时与另一不完全数组类型和一个具有指定大小的数组类型兼容。

6.12.6 兼容函数类型

要使函数兼容,请遵守以下规则:

6.12.7 特殊情况

signed int 的行为与 int 相同,不同之处可能在于位字段,其中无格式 int 可能表示无符号的数量。

另一点值得注意的是,每个枚举类型必须与某些整数类型兼容。对于可移植的程序,这意味着枚举类型是独立类型。通常,ISO C 标准将枚举类型视为独立类型。

6.12.8 复合类型

由两个兼容类型构成的复合类型也是递归定义的。兼容类型可能彼此不同的原因在于不完全数组或旧式函数类型。因此,复合类型最简单的描述是,它是与两个原始类型均兼容的类型,包括原始类型中的各个可用数组大小和各个可用参数列表