2017-08-16 37 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類型是一個不完整的類型不能完成

相關問題