前述
C語言中存在這樣一種類型,名叫不完整類型(Incomplete types)
,雖然我們可能不太理解,或許也沒有仔細研究過,但是在實際的編程中,我們卻已經用到過很多次了。
接下來我們就共同學習一下,內容比較簡單,一看就懂,一學就會。
不完整類型
不完整類型(Incomplete types)
是缺少足夠信息來確定該類型對象大小的對象類型,不完整類型可以在翻譯單元的某些點完整。
聽起來可能比較繞口,簡單來說就是,不完整類型是不知道對象所占空間大小,此時是無法使用sizeof()
的。但是可以通過后續再補充完整。
不完整類型主要有下面三種。
已聲明但未定義的類類型
內容未知的結構體或聯合體類型。在同一作用域的后面,定義同一結構體或聯合體的內容的聲明能使之完整。
struct node {
struct node *next; // struct node 在此點不完整
}; // struct node 在此點完整
未知邊界數組
簡單來說就是大小未知的數組,之后指定大小的聲明能使之完整,接下來看一個示例。
#include
extern int a[]; //此時a類型為int []是不完整類型
void fun1() {
printf("sizeof a = %d\\r\\n", sizeof(a)); // error
a[0] = 88; //OK
}
int a[3] = {1,2,3}; //此時a類型為int [3]是完整類型
void fun2() {
printf("sizeof a = %d\\r\\n", sizeof(a)); //OK
a[0] = 3; //OK
}
int main(int argc ,char **argv) {
fun1();
fun2();
return 0;
}
如果在fun1
函數中打印數組a的長度編譯時就會報如下錯誤:
invalid application of 'sizeof' to incomplete type 'int[]'
因為此時a為不完整類型,即不知道a的長度,所以無法使用sizeof。
但有的小伙伴卻有疑問了,為什么在fun1
函數中卻可以設置a[0]的值?
雖然這里使用了數組a,但是它會被轉換成指向其首元素的指針,而且這個轉換并不需要知道數組的大小。
而且C語言也不會檢查數組是否越界,他選擇相信程序員,把重心放在了程序的執行效率上,這也是為什么C語言執行效率高運行快的原因。
感興趣可以參考:為什么C語言執行效率高,運行快?
其實在外部聲明的時候可以完整聲明,例如上述示例我可以改為:extern int a[3];
此時在編譯程序fun1
就不會有編譯報錯提示了。
因為數組元素不能具有未知邊界數組類型,所以多維數組只能在第一個維度中有未知邊界:
extern int a[][2]; // OK:邊界未知的含有【2 個 int 元素的數組】元素的數組
extern int b[2][]; // error:數組有不完整類型
void 類型
可由 CV 限定,有別于其他不完整類型, void 不能補充聲明為完整類型。
總結
不完整類型有三種:
- void類型(不能被完整)
- 數組長度未知(可被完整)
- 已聲明但未定義的類類型(可被完整)
參考鏈接
https://en.cppreference.com/w/c/language/type
https://en.cppreference.com/w/cpp/language/type
END
-
類型
+關注
關注
0文章
10瀏覽量
10168 -
C語言
+關注
關注
180文章
7614瀏覽量
137712 -
編程
+關注
關注
88文章
3637瀏覽量
93983
發布評論請先 登錄
相關推薦
評論