0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C語(yǔ)言中的不完整類(lèi)型是什么

汽車(chē)電子技術(shù) ? 來(lái)源: typedef ? 作者:typedef ? 2023-02-21 10:03 ? 次閱讀

前述

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)型有三種:

  1. void類(lèi)型(不能被完整)
  2. 數(shù)組長(zhǎng)度未知(可被完整)
  3. 已聲明但未定義的類(lèi)類(lèi)型(可被完整)

參考鏈接

  • https://en.cppreference.com/w/c/language/type
  • https://en.cppreference.com/w/cpp/language/type

END

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 類(lèi)型
    +關(guān)注

    關(guān)注

    0

    文章

    10

    瀏覽量

    10140
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7575

    瀏覽量

    134053
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3521

    瀏覽量

    93268
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C語(yǔ)言中的基本數(shù)據(jù)類(lèi)型

    C語(yǔ)言是非常重要的一門(mén)程序設(shè)計(jì)語(yǔ)言,學(xué)好C語(yǔ)言再去學(xué)習(xí)其他編程語(yǔ)言將變得很輕松,因?yàn)榇蟛糠?/div>
    發(fā)表于 04-26 17:33 ?1800次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言中</b>的基本數(shù)據(jù)<b class='flag-5'>類(lèi)型</b>

    Go語(yǔ)言中的整數(shù)類(lèi)型

    在 Go 語(yǔ)言中,整型可以細(xì)分成兩個(gè)種類(lèi)十個(gè)類(lèi)型。
    發(fā)表于 07-20 15:25 ?770次閱讀

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

    C語(yǔ)言中基本數(shù)據(jù)類(lèi)型、變量和常量的使用
    發(fā)表于 08-18 16:42 ?1603次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言中</b>基本數(shù)據(jù)<b class='flag-5'>類(lèi)型</b>、變量和常量的使用

    ORcad 菜單欄顯示不完整

    如圖片,orcad安裝后 ,菜單欄顯示不完整,怎么設(shè)置這個(gè)? 用起來(lái) 不舒服
    發(fā)表于 03-23 21:27

    畫(huà)的電路圖輸出不完整,怎么設(shè)置?

    電路圖輸出不完整,怎么調(diào),還有藍(lán)框的大小能調(diào)嗎?
    發(fā)表于 06-04 13:54

    BMP解碼顯示圖片不完整

    再次請(qǐng)教原子個(gè)你的那個(gè)圖片解碼的(BMP部分的)工程已經(jīng)移植完畢(用的是znFAT32文件系統(tǒng))但是顯示的圖片不完整(左邊顯示的是圖片的右一半,右邊邊顯示的是圖片的左一半)
    發(fā)表于 07-10 04:35

    QT解決串口數(shù)據(jù)接收不完整問(wèn)題

    1. 相關(guān)文章匯總(1)QT解決串口數(shù)據(jù)接收不完整問(wèn)題(貌似貼出的代碼可以存下串口接受的全部數(shù)據(jù))(2)qt中使用串口類(lèi)接收數(shù)據(jù)不完整 (3)Qt5.7串口接收數(shù)據(jù)不完整因?yàn)榇诒緛?lái)就不是一次接收
    發(fā)表于 08-18 06:58

    請(qǐng)問(wèn)在C語(yǔ)言中如何使用bool類(lèi)型?

    C語(yǔ)言中如何使用bool類(lèi)型?
    發(fā)表于 10-22 07:20

    如何解決串口接收數(shù)據(jù)不完整?

    如何解決串口接收數(shù)據(jù)不完整?
    發(fā)表于 11-22 07:37

    rt-thread使用ps顯示的線(xiàn)程名字不完整怎么解決?

    使用ps顯示的線(xiàn)程名字不完整
    發(fā)表于 05-09 10:04

    不完整地址轉(zhuǎn)發(fā)表的拓?fù)浒l(fā)現(xiàn)方法

    出的AFT基本推導(dǎo)規(guī)則BRR的完備性.此外還對(duì)基于不完整AFT進(jìn)行拓?fù)浒l(fā)現(xiàn)的NP難問(wèn)題進(jìn)行了討論,深入剖析了任意實(shí)際的局域網(wǎng)絡(luò)的不完整AFT通過(guò)BRR推導(dǎo)完成后的各種可能情況,并分析了單純依靠AFT進(jìn)行拓?fù)浒l(fā)現(xiàn)的局限性.該工作對(duì)于基于AFT進(jìn)
    發(fā)表于 01-12 16:28 ?0次下載
    <b class='flag-5'>不完整</b>地址轉(zhuǎn)發(fā)表的拓?fù)浒l(fā)現(xiàn)方法

    C語(yǔ)言中隨機(jī)數(shù)的生成代碼

    C語(yǔ)言中隨機(jī)數(shù)的生成完整代碼:
    的頭像 發(fā)表于 02-20 09:21 ?1w次閱讀

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

    APM32F091RCT6_SPI_從機(jī)接收數(shù)據(jù)不完整
    發(fā)表于 11-09 21:04 ?0次下載
    APM32F091RCT6_SPI_從機(jī)接收數(shù)據(jù)<b class='flag-5'>不完整</b>

    淺談C語(yǔ)言中的三種不完整類(lèi)型

    不完整類(lèi)型(Incomplete types)是缺少足夠信息來(lái)確定該類(lèi)型對(duì)象大小的對(duì)象類(lèi)型,不完整類(lèi)型
    發(fā)表于 12-16 09:52 ?446次閱讀

    如何獲取ChatGPT回答不完整的內(nèi)容

    ____tz_zs 對(duì)于 ChatGPT 回答不完整的情況(篇幅限制,沒(méi)有說(shuō)完),可以輸入“繼續(xù)”指令,讓其繼續(xù)回答下去,獲得完整內(nèi)容。 如下圖,發(fā)問(wèn) “使用web3js 調(diào)用 eth鏈智能合約” 直到這里才是獲得了剛剛問(wèn)題 “使用web3js 調(diào)用 eth鏈智能合約”
    發(fā)表于 02-10 10:48 ?0次下載
    如何獲取ChatGPT回答<b class='flag-5'>不完整</b>的內(nèi)容