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

Go語(yǔ)言中的整數(shù)類(lèi)型
C語(yǔ)言中基本數(shù)據(jù)類(lèi)型、變量和常量的使用

BMP解碼顯示圖片不完整
QT解決串口數(shù)據(jù)接收不完整問(wèn)題
不完整地址轉(zhuǎn)發(fā)表的拓?fù)浒l(fā)現(xiàn)方法

APM32F091RCT6_SPI_從機(jī)接收數(shù)據(jù)不完整

淺談C語(yǔ)言中的三種不完整類(lèi)型
如何獲取ChatGPT回答不完整的內(nèi)容

評(píng)論