什么是C中的复合类型?

Vor*_*rac 11 c language-lawyer c11

§6.2.7.5(第66页):

示例给定以下两个文件范围声明:

int f(int (*)(), double (*)[3]);  
int f(int (*)(char *), double (*)[]);  
Run Code Online (Sandbox Code Playgroud)

由此产生的函数的复合类型是:

int f(int (*)(char *), double (*)[3]);
Run Code Online (Sandbox Code Playgroud)

在示例上方,他们解释了复合类型是一种类型,与两种不同类型兼容.我会直观地将"复合类型"这个短语理解为"结构和联合",这似乎是偏离目标的.

什么是C中的复合类型,它用于什么?有人可以详细解释上面的例子吗?

Lun*_*din 9

我可能不是回答这个问题的合适人选,但是对于它的价值,这里是C99的基本原理,这可能会有所帮助:

6.2.7兼容型和复合型

引入了兼容类型和复合类型的概念,以允许C89讨论类型声明不必相同的情况.这些术语在解释不完整类型和完成类型之间的关系时特别有用.通过在C99中添加可变长度数组(第6.5.5.2节),扩展了数组类型兼容性,以便可变长度数组与已知常量大小的数组和具有不完整类型的数组兼容.

两个不同的翻译单元中的结构,联合或枚举类型声明不正式声明相同的类型,即使这些声明的文本来自相同的头文件,因为翻译单元本身是不相交的.因此,标准为这些类型规定了额外的兼容性规则,以便两个这样的声明在它们足够相似时是兼容的.

C99的安静改变

现在,不同翻译单元中的结构或联合类型声明必须具有相同的标签才能兼容.


Joh*_*ode 5

我会直观地将"复合类型"这个短语理解为"结构和联合",这似乎是偏离目标的.

在C语言定义中,数组和结构是聚合类型(由多个元素组成的类型).工会是他们自己的动物,因为他们一次只能承担一个元素的价值.

复合类型对于编译器实现者来说更是一个问题,而不是我们的普通代码猴子.您和我不会尝试定义复合类型,也不会声明该类型的对象.

在给出的示例中,您有两个函数的文件范围声明,f它们彼此略有不同.根据6.2.7/3中提供的规则,编译器确定一种适用于两者的类型,以便它可以在编译时强制执行类型语义(即f,即使使用稍微不同的声明,也可以正确检查任何调用)并生成适当的机器代码来调用该函数.