可以int (*)[]
是不完整的类型吗?
C 2018 6.2.5 1说:
在翻译单元内的各个点上,对象类型可能不完整(缺少足够的信息来确定该类型对象的大小)或完整(具有足够的信息)。
因此,似乎如果类型的大小已知,则该类型是完整的。6.2.6.1 28指定某些类型的指针必须具有相同的大小(指向void
和的字符,指向兼容类型的指针,指向结构的指针以及指向联合的指针),但是指向其他类型的指针可能会有所不同。
在C实现中,所有指针或指向数组的所有指针 int
都具有相同的大小,则int (*)[]
已知的大小,因此将是完整的。例如,在对大型数组使用不同指针的实现中,大小是未知的,因此不完整。
作为MM指出,一个结构必须不包含不完全型的成员,在6.7.2.1 3.这表明与指针中的一个尺寸的实现必须接受除最终柔性阵列构件,每一个约束struct { int (*p)[]; }
而一实现具有不同此类数组的大小必须诊断出约束违例。(这反过来意味着这样的声明不是严格符合C的一部分。)
void *
完整的事实表明指向不完整类型的指针可以完整。它不显示指向不完整类型的指针是否可以不完整。如果有人问“哺乳动物可以成为大象吗?”,如果表明“狮子是哺乳动物”,就不能说明哺乳动物不能成为大象。该问题询问指向不完整类型的指针的集合X是否可能包含不完整的元素。指示不完整类型的指针集X包含一个完成元素是无关紧要的。