衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C語言中的不完整類型是什么

汽車電子技術 ? 來源: typedef ? 作者:typedef ? 2023-02-21 10:03 ? 次閱讀

前述

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 不能補充聲明為完整類型。

總結

不完整類型有三種:

  1. void類型(不能被完整)
  2. 數組長度未知(可被完整)
  3. 已聲明但未定義的類類型(可被完整)

參考鏈接

  • 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
收藏 人收藏

    評論

    相關推薦

    C語言中的基本數據類型

    C語言是非常重要的一門程序設計語言,學好C語言再去學習其他編程語言將變得很輕松,因為大部分
    發表于 04-26 17:33 ?2101次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言中</b>的基本數據<b class='flag-5'>類型</b>

    Go語言中的整數類型

    在 Go 語言中,整型可以細分成兩個種類十個類型
    發表于 07-20 15:25 ?965次閱讀

    C語言中基本數據類型、變量和常量的使用

    C語言中基本數據類型、變量和常量的使用
    發表于 08-18 16:42 ?2919次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言中</b>基本數據<b class='flag-5'>類型</b>、變量和常量的使用

    ORcad 菜單欄顯示不完整

    如圖片,orcad安裝后 ,菜單欄顯示不完整,怎么設置這個? 用起來 不舒服
    發表于 03-23 21:27

    畫的電路圖輸出不完整,怎么設置?

    電路圖輸出不完整,怎么調,還有藍框的大小能調嗎?
    發表于 06-04 13:54

    BMP解碼顯示圖片不完整

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

    QT解決串口數據接收不完整問題

    1. 相關文章匯總(1)QT解決串口數據接收不完整問題(貌似貼出的代碼可以存下串口接受的全部數據)(2)qt中使用串口類接收數據不完整 (3)Qt5.7串口接收數據不完整因為串口本來就不是一次接收
    發表于 08-18 06:58

    請問在C語言中如何使用bool類型

    C語言中如何使用bool類型
    發表于 10-22 07:20

    如何解決串口接收數據不完整

    如何解決串口接收數據不完整
    發表于 11-22 07:37

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

    使用ps顯示的線程名字不完整
    發表于 05-09 10:04

    不完整地址轉發表的拓撲發現方法

    出的AFT基本推導規則BRR的完備性.此外還對基于不完整AFT進行拓撲發現的NP難問題進行了討論,深入剖析了任意實際的局域網絡的不完整AFT通過BRR推導完成后的各種可能情況,并分析了單純依靠AFT進行拓撲發現的局限性.該工作對于基于AFT進
    發表于 01-12 16:28 ?0次下載
    <b class='flag-5'>不完整</b>地址轉發表的拓撲發現方法

    C語言中隨機數的生成代碼

    C語言中隨機數的生成完整代碼:
    的頭像 發表于 02-20 09:21 ?1w次閱讀

    APM32F091RCT6_SPI_從機接收數據不完整

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

    淺談C語言中的三種不完整類型

    不完整類型(Incomplete types)是缺少足夠信息來確定該類型對象大小的對象類型不完整類型
    發表于 12-16 09:52 ?528次閱讀

    如何獲取ChatGPT回答不完整的內容

    ____tz_zs 對于 ChatGPT 回答不完整的情況(篇幅限制,沒有說完),可以輸入“繼續”指令,讓其繼續回答下去,獲得完整內容。 如下圖,發問 “使用web3js 調用 eth鏈智能合約” 直到這里才是獲得了剛剛問題 “使用web3js 調用 eth鏈智能合約”
    發表于 02-10 10:48 ?0次下載
    如何獲取ChatGPT回答<b class='flag-5'>不完整</b>的內容
    百家乐长龙技巧| 新锦江百家乐官网赌场娱乐网规则| 百家乐官网出租平台| 拉斯维加斯娱乐城| 皇冠代理| 南充市| 澳门百家乐官网代理| 百家乐官网输了好多钱| 在百家乐官网二庄两闲揽的概率| 百家乐官网h游戏怎么玩| 广东百家乐官网桌布| 蓝盾百家乐官网代理打| 墓地风水24山| 百家乐分析资料| 真钱百家乐五湖四海全讯网| 钱百家乐取胜三步曲| 百家乐英皇娱乐平台| 大发888游戏充值| 皇冠开户娱乐网| 最新棋牌游戏| 百家乐官网实战案例| 重庆百家乐官网团购百嘉乐量贩KTV地址 | 澳门百家乐打缆| E世博百家乐娱乐城| 威尼斯人娱乐城网上赌博 | 通吃98| 赌百家乐官网波音备用网| 百家乐官网博弈指数| 百家乐视频二人麻将| 百家乐桌子租| 金龙娱乐城开户送彩金| 川宜百家乐官网软件| 百家乐官网里靴是什么意识| 百家乐注册送10彩金| 大发888ber| 金木棉赌场| 百家乐官网赌博机销售| 百家乐官网平玩法可以吗| 多伦多百家乐的玩法技巧和规则 | 香港百家乐官网赌场| 百家乐稳中一注法|