【问题标题】:What is a composite type in C?什么是 C 中的复合类型?
【发布时间】:2013-05-01 08:10:41
【问题描述】:

来自§6.2.7.5(第 66 页):

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

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

函数的结果复合类型是:

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

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

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

【问题讨论】:

  • 我想你的意思是§6.2.7?
  • 您是否考虑过向上滚动到该示例 (6.2.7/3) 上方的文本,其中令人惊讶的是,其中声明了复合类型的定义?
  • 说复合类型是两种类型统一的结果有用吗?
  • @TonyTheLion 不,double (*)[3] 是一个指向 3 个数组的指针 double
  • @TonyTheLion 不,不是,它是一个指向具有 3 个元素的双精度数组的数组指针

标签: c language-lawyer c11


【解决方案1】:

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

6.2.7 兼容类型和复合类型

引入兼容类型和复合类型的概念是为了让 C89 讨论那些 类型声明不需要相同的情况。这些 术语在解释之间的关系时特别有用 不完整类型和完整类型。加上变量 C99 中的长度数组(第 6.7.5.2 节),扩展了数组类型兼容性 以便可变长度数组与 已知常量大小和类型不完整的数组。

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

C99 的悄然变化

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

【讨论】:

    【解决方案2】:

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

    在C语言的定义中,数组和结构体是聚合类型(由多个元素组成的类型)。联合是一种自己的动物,因为它们一次只能获取一个元素的值。

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

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

    【讨论】:

      猜你喜欢
      • 2019-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-16
      • 1970-01-01
      • 1970-01-01
      • 2011-03-31
      • 2015-09-05
      相关资源
      最近更新 更多