2017-08-16 77 views
3

我在C11标准中发现的所有不完整类型都是不完整的数组类型。我想知道是否有非数组不完整类型。是否有非数组不完整类型?

+1

正向声明中的struct –

+1

'void'是一个不完整的类型,无法完成。 –

回答

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

2

是的,void也是一个不完整的类型,它可以从来没有是完整的。

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

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

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

P19,

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

和,P22,

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

2

structunion前向声明没有其内容的一种定义也是不完整类型

C standard的部分6.2.5:

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

5

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

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

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

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

void类型是一个不完整的类型不能完成