什么是C中的复合类型?

时间:2013-05-07 11:31:59

标签: c language-lawyer c11

§6.2.7.5(第66页):

  

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

int f(int (*)(), double (*)[3]);  
int f(int (*)(char *), double (*)[]);  
     

该函数的最终复合类型为:

int f(int (*)(char *), double (*)[3]);

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

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

2 个答案:

答案 0 :(得分:9)

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

  

6.2.7兼容类型和复合类型

     

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

     

两种不同的结构,联合或枚举类型声明   翻译单位不正式声明相同的类型,即使是   这些声明的文本来自同一个头文件,因为   翻译单位本身是不相交的。因此标准   为这些类型指定其他兼容性规则,以便两个   如果这些声明足够相似,则它们是相容的。

     

C99的安静改变

     

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

答案 1 :(得分:5)

  

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

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

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

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