不完整類型是尚未指定其成員的結構或聯合類型,尚未指定其維度的數組類型,或void類型(無法完成void類型)。 這種類型可能無法實例化(其大小未知),也不能訪問其成員(它們也是未知的); 但是,可以使用派生的指針類型(但不能解除引用)。
基本介紹
- 中文名:不完全類型
- 外文名:Incomplete type
介紹,代碼釋例,C語言不完全類型,
介紹
不完全類型指“函式之外、類型的大小不能被確定的類型”,只能以有限方式使用。不能定義該類型的對象。不完全類型只能用於定義指向該類型的指針及引用,或者用於聲明使用該類型作為形參類型或者返回值類型。
C的類型分為:
- 對象類型(char、int、數組、指針、結構體等)
- 函式類型
- 不完全類型
結構體的聲明就是一個不完全類型的典型例子。
struct Woman_tag;struct Man_tag {....struct Woman_tag *wife;....};struct Woman_tag {....int age;....};
代碼釋例
它們通常用作指針,作為前向或外部聲明。 例如,代碼可以聲明一個不完整的類型,如下所示:
struct thing *pt;
這將pt聲明為指向struct thing和不完整類型struct的指針。 數據指針始終具有相同的位元組寬度,無論它們指向什麼,因此該語句本身有效(只要pt未被解除引用)。 不完整類型可以在稍後的同一範圍內通過重新聲明來完成:
struct thing { int num;}; /* thing struct type is now completed */
不完整的類型用於實現遞歸結構; 類型聲明的正文可以推遲到翻譯單位的後面:
typedef struct Bert Bert;typedef struct Wilma Wilma;struct Bert { Wilma *wilma;};struct Wilma { Bert *bert;};
不完整類型也用於數據隱藏; 不完整類型在頭檔案中定義,而主體僅在相關源檔案中定義。
C語言不完全類型
不完全類型也就是不知道變數的所有的類型信息。比如可以聲明一個數組,但是不給出該數組的長度;聲明一個指針,但是不給出該指針的類型;聲明一個結構體類型,但是不給出完整的結構體定義,只說它是一個結構體。但是最終你必須得給出完整的類型信息。要不然編譯會報錯的。編譯器在編譯某個單元時,如果遇到一個不完全類型的定義的類型或變數(假設它叫p),它會把這當作正常現象,然後繼續編譯該單元,如果在本單元內找不到p完整的類型信息,它就去其它編譯單元找。如果把整個編譯過程分為編譯、連結兩個過程。在編譯階段遇到不完全類型是正常的,但是在連結過程中,所有的不完全類型必須存在對應的完整類型信息,否則報錯。
舉個例子,下面的代碼先聲明了一個不完全類型的變數字元數組str,沒有給出它的長度信息。然後再定義了一次str數組,這次給出的長度信息。
char str[];//不完全類型定義char str[10];//終於遇到了str數組的完整類型信息,編譯器鬆了一口氣
注意:不完全類型定義不適合局部變數,如果把上面兩行代碼放在一個函式體中,會出現符號重定義錯誤。
不完全類型由於不包含具體的類型信息,所以不能通過sizeof來獲得其大小。(編譯器君的旁邊:我連它的完整類型都不知道,我怎么告訴你它的大小。)下面的代碼不能編譯通過。它會報錯 error: invalid application of `sizeof' to an incomplete type 不能對不完全類型使用sizeof。
#include<stdio.h> char str[];int n =sizeof(str);char str[10]; int main(){ printf("%d ",n); return 0;}
如果把int n = sizeof(str)放到charstr[10]後面就沒事了。