我在C11标准中找到的所有不完整类型都是不完整的数组类型。
我想知道是否存在非数组不完整类型。
答案 0 :(得分:5)
不完整类型是描述标识符但缺少确定标识符大小所需信息的类型。 “不完整类型”可以是
一种结构类型,其成员尚未指定。
一个联合类型,其成员尚未指定。
尚未指定其尺寸的数组类型。
void类型是一个无法完成的不完整类型
答案 1 :(得分:2)
是的,void
也是一种不完整的类型,可以永远不会完成。
此外,正如其他答案所述,未知内容的结构或联合声明(即前瞻性声明)也是不完整的类型。请记住,一旦用它的成员(定义内容)声明它就会变成一个完整的类型。
添加,引用C11
,章节§6.2.5/ P1
[...]在翻译单元内的各个点处,对象类型可以是 不完整(缺乏足够的信息来确定该类型物体的大小)或 完成(有足够的信息)。
P19,
void
类型包含一组空值;它是一个不完整的对象类型 无法完成。
和,P22,
未知大小的数组类型是不完整类型。对于该类型的标识符,通过在稍后的声明中指定大小(具有内部或外部链接)来完成。未知内容的结构或联合类型(如(6.7.2.3)中所述)是一种不完整的类型。对于该类型的所有声明,通过在同一范围内声明相同的结构或联合标记及其定义内容来完成
答案 2 :(得分:2)
struct
或union
的前向声明,如果没有后者对其内容的定义,也是一种不完整的类型。
来自C standard的第6.2.5节:
22 未知大小的数组类型是不完整类型。对于该类型的标识符,通过指定a中的大小来完成 后来申报(内部或外部联系)。 结构或 未知内容的联合类型(如6.7.2.3中所述)是一种 不完全类型。对于该类型的所有声明,它已完成, 通过声明与其定义内容相同的结构或联合标记 后来在同一范围内。
答案 3 :(得分:2)
供参考,什么不完整,完成?
在翻译单元内的各个点处,对象类型可以是 不完整(缺乏足够的信息来确定该类型对象的大小)或完成(有足够的信息)。 C11§6.2.51
除了潜在的struct
,union
,数组和始终void
,enum
暂时不完整,因为它们的大小不完整,直到}
...在终止枚举器声明列表的
}
之后,枚举类型不完整,之后完成。 C11§6.7.2.24
int main() {
enum ee1 { a1 = 0, b1 = sizeof(int), c1 };
printf("%zu\n", sizeof(enum ee1)); // OK
// error: invalid application of 'sizeof' to incomplete type 'enum ee2'
// v--------------v
enum ee2 { a2 = 0, b2 = sizeof(int), c2 = sizeof(enum ee2) }; // Bad
printf("%zu\n", sizeof(enum ee2)); // OK
}
另外
具有相同作用域且使用相同标记的结构,联合或枚举类型的所有声明都声明相同的类型。无论是否存在标签或该类型的其他声明都在同一翻译单元中,该类型在定义内容的列表的右括号之后不完整,之后完成。 §6.7.2.34