我在C11标准中发现的所有不完整类型都是不完整的数组类型。我想知道是否有非数组不完整类型。是否有非数组不完整类型?
回答
仅供参考,什么是不完整的,完整?
在一个翻译单元内的各个点的对象类型可以是 不全(缺少足够的信息来确定该类型的对象的大小)或完整(具有足够的信息)。 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
是的,void
也是一个不完整的类型,它可以从来没有是完整的。
此外,如其他答案中所述,未知内容(即前向声明)的结构或联合声明也是不完整的类型。请记住,一旦它被成员声明(定义内容),就会变成完整的类型。
要添加,引用C11
,章§6.2.5/ P1
[...]在一个翻译单元内的各个点的对象类型可以是 不完整的(缺乏足够的信息来确定大小该类型的对象)或 完整(具有足够的信息)。
P19,
的
void
类型包括一个空的一组值;它是不完整的对象类型, 无法完成。
和,P22,
未知大小的数组类型是一个不完整的类型。对于该类型的标识符,通过在稍后的声明中指定大小(使用内部或外部链接)完成。未知内容的结构或联合类型(如(6.7.2.3)中所述)是一种不完整类型,对于该类型的所有声明,通过在相同范围内声明相同的结构或联合标签及其定义的内容。
的struct
或union
前向声明没有其内容的一种定义也是不完整类型
从C standard的部分6.2.5:
未知大小的数组类型是不完整的类型。对于该类型的标识符,通过在稍后的声明中指定大小(使用内部或外部链接)完成。 结构或 未知内容的联合类型(如6.7.2.3中所述)是不完整类型的 。对于所有类型的声明, 通过在同一范围内声明相同的结构或联合标签及其定义内容 完成。
不完整类型是描述标识符的类型,但缺少确定标识符大小所需的信息。 “不完整类型”可以是
其结构类型,其成员尚未指定。
一个联合类型,其成员您尚未指定。
其维数尚未指定的数组类型。
void类型是一个不完整的类型不能完成
- 1. 错误:数组类型具有不完整的元素类型
- 2. C错误数组:数组类型具有不完整的元素类型。
- 3. 参数有不完整的类型
- 4. 数组元素有不完整的类型
- 5. GCC错误:数组类型具有不完整的元素类型
- 6. C++这是一个不完整类型?
- 7. 字段有不完整的类型C++
- 8. yacc - 字段有不完整的类型
- 9. 错误:字段有不完整类型
- 10. Akka完整参数类型
- 11. “错误数组类型具有不完整的元素类型”对于二维数组
- 12. 类内类 - 不完整类型是不允许的
- 13. if-else取决于T是否是一个完整的类型
- 14. 一个不完整类型的非共享智能指针
- 15. C++指针不完整的类类型是不允许的
- 16. 是不完整的数组类型保证能够存储一个元素?
- 17. “类型是不完整的”(但不是)和代码编译
- 18. “不完整类型不允许”错误
- 19. Ç的typedef:参数具有不完整的类型
- 20. C编程:参数有不完整的类型错误
- 21. 什么是类型完整性原则?
- 22. 将字符类型转换为整数类型是否安全
- 23. 为什么不能模板非类型参数是类类型
- 24. C++中的不完整类型
- 25. C结构体的不完整类型
- 26. 如何使用不完整的类型
- 27. 扩展'不完整'类型(SWIG)
- 28. 下一个struct item,不完整类型
- 29. 不完整的类型元素[2] []
- 30. DescribeStreamOutcome报告为“不完整类型”
正向声明中的struct –
'void'是一个不完整的类型,无法完成。 –