【发布时间】:2020-04-30 15:27:14
【问题描述】:
int (*)[] 可以是不完整类型吗?
C 2018 6.2.5 1 说:
在翻译单元内的不同点,对象类型可能是不完整(缺乏足够的信息来确定该类型对象的大小)或完整(有足够的信息)。
因此,如果类型的大小已知,则该类型似乎是完整的。 6.2.6.1 28 指定某些类型的指针必须具有相同的大小(指向void 和字符的指针、指向兼容类型的指针、指向结构的指针和指向联合的指针),但指向其他类型的指针可能会有所不同。
在所有指针或指向int 数组的所有指针具有相同大小的C 实现中,那么int (*)[] 的大小是已知的,因此它是完整的。在一个实现中,比如说,对大数组使用不同的指针,大小是未知的,所以它是不完整的。
作为M.M points out,根据 6.7.2.1 3 中的约束,结构不得包含类型不完整的成员,最终灵活数组成员除外。这表明具有一种指针大小的实现必须接受struct { int (*p)[]; }而对于此类数组具有不同大小的实现必须诊断违反约束。 (这反过来又意味着这样的声明不是严格符合 C 的一部分。)
【问题讨论】:
-
6.2.5(p22) 帮助? (或者它是否增加了更多的混乱,允许稍后声明完成不完整的类型?)
-
@DavidC.Rankin 在 6.2.5/20 中甚至说指针总是完整的类型
-
@LanguageLawyer:这有什么关系?问题是“有一个不是 Y 的 X 吗?”,而不是“有一个不是 Y 的 X 吗?”
-
@LanguageLawyer:
void *是完整的事实表明指向不完整类型的指针可以是完整的。它没有显示指向不完整类型的指针是否不完整。如果有人问“哺乳动物可以是大象吗?”,表明“狮子是哺乳动物”并不能说明哺乳动物不能是大象。该问题询问指向不完整类型的指针集合 X 是否可能包含不完整的元素。表明指向不完整类型的指针集合 X 包含完整的元素是无关紧要的。 -
@EricPostpischil 哎呀。我把标题误读为“指向不完整类型的指针可以完整吗?”
标签: c pointers language-lawyer incomplete-type