是否存在非数组不完整类型?

时间:2017-08-16 20:34:21

标签: c types incomplete-type

我在C11标准中找到的所有不完整类型都是不完整的数组类型。

我想知道是否存在非数组不完整类型。

4 个答案:

答案 0 :(得分:5)

不完整类型是描述标识符但缺少确定标识符大小所需信息的类型。 “不完整类型”可以是

  • 一种结构类型,其成员尚未指定。

  • 一个联合类型,其成员尚未指定。

  • 尚未指定其尺寸的数组类型。

void类型是一个无法完成的不完整类型

答案 1 :(得分:2)

是的,void也是一种不完整的类型,可以永远不会完成。

此外,正如其他答案所述,未知内容的结构或联合声明(即前瞻性声明)也是不完整的类型。请记住,一旦用它的成员(定义内容)声明它就会变成一个完整的类型。

添加,引用C11,章节§6.2.5/ P1

  

[...]在翻译单元内的各个点处,对象类型可以是   不完整(缺乏足够的信息来确定该类型物体的大小)或   完成(有足够的信息)。

P19,

  

void类型包含一组空值;它是一个不完整的对象类型   无法完成。

和,P22,

  

未知大小的数组类型是不完整类型。对于该类型的标识符,通过在稍后的声明中指定大小(具有内部或外部链接)来完成。未知内容的结构或联合类型(如(6.7.2.3)中所述)是一种不完整的类型。对于该类型的所有声明,通过在同一范围内声明相同的结构或联合标记及其定义内容来完成

答案 2 :(得分:2)

structunion的前向声明,如果没有后者对其内容的定义,也是一种不完整的类型。

来自C standard的第6.2.5节:

  

22 未知大小的数组类型是不完整类型。对于该类型的标识符,通过指定a中的大小来完成   后来申报(内部或外部联系)。 结构或   未知内容的联合类型(如6.7.2.3中所述)是一种   不完全类型。对于该类型的所有声明,它已完成,   通过声明与其定义内容相同的结构或联合标记   后来在同一范围内。

答案 3 :(得分:2)

供参考,什么不完整完成

  

在翻译单元内的各个点处,对象类型可以是   不完整(缺乏足够的信息来确定该类型对象的大小)或完成(有足够的信息)。 C11§6.2.51

除了潜在的structunion,数组和始终voidenum暂时不完整,因为它们的大小不完整,直到}

  

...在终止枚举器声明列表的}之后,枚举类型不完整,之后完成。 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