有時候我們在一些編譯器寫**的時候會碰見不完全型別這個編譯錯誤,那麼什麼是不完全型別,為啥會出現呢
不完全型別指「函式之外、型別的大小不能被確定的型別」,只能以有限方式使用。不能定義該型別的物件。不完全型別只能用於定義指向該型別的指標及引用 [1] ,或者用於宣告使用該型別作為形參型別或者返回值型別。
c的型別分為:
結構體的宣告就是乙個不完全型別的典型例子。
struct
woman_tag;
struct
man_tag ;
struct
woman_tag ;
不完全型別也就是不知道變數的所有的型別資訊。比如可以宣告乙個陣列,但是不給出該陣列的長度;宣告乙個指標,但是不給出該指標的型別;宣告乙個結構體型別,但是不給出完整的結構體定義,只說它是乙個結構體。但是最終你必須得給出完整的型別資訊。要不然編譯會報錯的。編譯器在編譯某個單元時,如果遇到乙個不完全型別的定義的型別或變數(假設它叫p),它會把這當作正常現象,然後繼續編譯該單元,如果在本單元內找不到p完整的型別資訊,它就去其它編譯單元找。如果把整個編譯過程分為編譯、鏈結兩個過程。在編譯階段遇到不完全型別是正常的,但是在鏈結過程中,所有的不完全型別必須存在對應的完整型別資訊,否則報錯。
舉個例子,下面的**先宣告了乙個不完全型別的變數字元陣列str,沒有給出它的長度資訊。然後再定義了一次str陣列,這次給出的長度資訊。
char
str;
//不完全型別定義
char
str[10];
//終於遇到了str陣列的完整型別資訊,編譯器松了一口氣
注意:不完全型別定義不適合區域性變數,如果把上面兩行**放在乙個函式體中,會出現符號重定義錯誤。
也就是不完整型別的型別號。不能用來定義物件。
而需要定義包含具體的型別實現的標頭檔案,
比如ostringstream out,這個如果不包含標頭檔案sstream,注意不是sstream.h,那麼就會在編譯的時候出現不完全型別這個錯誤。
前置宣告也屬於不完全型別。
不完全型別
c 允許在乙個 檔案中存放多個類,但這樣往往不便於類的管理,所以一向是提倡乙個檔案中只存放乙個類。不過呢,隨著類規模的不斷膨脹,乙個檔案中存放乙個類也有些顯得臃腫,或者是在某個角度上不便於 的組織。因此,c 2.0中引入了不完全型別的概念,即啟用了新的修飾符partial。借助該修飾符,我們可以在多...
不完全型別
不完全型別指 函式之外 型別的大小不能被確定的型別 總結一下,c的型別分為 結構體的宣告就是乙個不完全型別的典型例子。struct woman tag struct man tag struct woman tag 這樣是沒問題的。如果將man tag結構中的struct woman tag wif...
C 刪除不完全型別陣列
看智慧型指標的時候遇到一組函式蠻有意思的,即checked delete t x 和checked array delete t x 這兩個函式的作用是安全刪除引數所指向的變數或陣列。templateinline void checked delete t x templateinline void...