複製鏈接
請複製以下鏈接發送給好友

不完全類型

鎖定
不完整類型是尚未指定其成員的結構或聯合類型,尚未指定其維度的數組類型,或void類型(無法完成void類型)。 這種類型可能無法實例化(其大小未知),也不能訪問其成員(它們也是未知的); 但是,可以使用派生的指針類型(但不能解除引用)。
中文名
不完全類型
外文名
Incomplete type

不完全類型介紹

不完全類型指“函數之外、類型的大小不能被確定的類型”,只能以有限方式使用。不能定義該類型的對象。不完全類型只能用於定義指向該類型的指針及引用 [1]  ,或者用於聲明使用該類型作為形參類型或者返回值類型。
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]後面就沒事了。
參考資料