【发布时间】:2017-08-16 20:34:20
【问题描述】:
我在 C11 标准中发现的不完整类型都是不完整的数组类型。
我想知道是否存在非数组不完整类型。
【问题讨论】:
-
前向声明中的结构
-
void是不完整的类型,无法完成。
标签: c types incomplete-type
我在 C11 标准中发现的不完整类型都是不完整的数组类型。
我想知道是否存在非数组不完整类型。
【问题讨论】:
void 是不完整的类型,无法完成。
标签: c types incomplete-type
不完整类型是描述标识符但缺少确定标识符大小所需信息的类型。 “不完整类型”可以是
尚未指定其成员的结构类型。
您尚未指定其成员的联合类型。
尚未指定维度的数组类型。
void类型是不完整的类型,不能补全
【讨论】:
供参考,什么是不完整、完整?
在翻译单元内的不同点,对象类型可能是 不完整(缺乏足够的信息来确定该类型对象的大小)或完整(有足够的信息)。 C11 §6.2.5 1
除了可能的struct、union、数组和总是void、enum 暂时不完整,因为它们的大小在} 之前是不完整的
... 枚举类型在终止枚举器声明列表的
}之后是不完整的,并在其后完成。 C11 §6.7.2.2 4
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.3 4
【讨论】:
struct 或 union 的前向声明没有后面的内容定义也是不完整的类型。
来自C standard 的第 6.2.5 节:
22 未知大小的数组类型是不完整类型。对于该类型的标识符,它是通过指定大小来完成的 稍后声明(带有内部或外部链接)。 结构或 未知内容的联合类型(如 6.7.2.3 中所述)是 不完整的类型。对于该类型的所有声明,它已完成, 通过声明相同的结构或联合标记及其定义内容 稍后在同一范围内。
【讨论】:
是的,void 也是一个不完整的类型,它永远不会是完整的。
此外,如其他答案中所述,未知内容的结构或联合的声明(即前向声明)也是不完整的类型。请记住,一旦使用它的成员(定义内容)声明它,它就会变成一个完整的类型。
添加,引用C11,章节§6.2.5/P1
[...] 在翻译单元内的不同点,对象类型可能是 不完整(缺乏足够的信息来确定该类型对象的大小)或 完整(有足够的信息)。
P19,
void类型包含一组空值;它是一个不完整的对象类型 无法完成。
还有,P22,
未知大小的数组类型是不完整类型。对于该类型的标识符,它是通过在稍后的声明中指定大小(具有内部或外部链接)来完成的。未知内容的结构或联合类型(如 (6.7.2.3) 中所述)是不完整的类型。对于该类型的所有声明,通过稍后在相同范围内声明具有其定义内容的相同结构或联合标记来完成.
【讨论】: