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

    浏览量

    10114
  • C语言
    +关注

    关注

    180

    文章

    7530

    浏览量

    128698
  • 编程
    +关注

    关注

    88

    文章

    3440

    浏览量

    92400
收藏 人收藏

    评论

    相关推荐

    ORcad 菜单栏显示不完整

    如图片,orcad安装后 ,菜单栏显示不完整,怎么设置这个? 用起来 不舒服
    发表于 03-23 21:27

    画的电路图输出不完整,怎么设置?

    电路图输出不完整,怎么调,还有蓝框的大小能调吗?
    发表于 06-04 13:54

    linux cp文件出现文件不完整问题

    我的一台linux机器,上面挂了两个nas,我从一个nas用cp命令拷贝到另一个nas时,偶尔出现文件拷贝得不完整的情况,请问这个为什么?有没有办法解决这个问题
    发表于 12-01 22:57

    BMP解码显示图片不完整

    再次请教原子个你的那个图片解码的(BMP部分的)工程已经移植完毕(用的是znFAT32文件系统)但是显示的图片不完整(左边显示的是图片的右一半,右边边显示的是图片的左一半)
    发表于 07-10 04:35

    创建对话框时底部显示不完整

    附件图片的效果是ucgui3.98模拟器的显示效果,禁止GUI_SUPPORT_MEMDEV时显示异常,使能GUI_SUPPORT_MEMDEV时显示正常;但是在我的板子上测试的话,不管GUI_SUPPORT_MEMDEV是否使能,都是显示异常,底部有一部分显示不完整,请问各位有遇到过类似的现象吗?谢谢先!
    发表于 04-03 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

    TCP通信数据较长时读取不完整和什么有关

    数据量较小时,比如服务端发送1K,2K时,没问题,上位机可以读取到完整的一帧。如果一次发送5K,10K时,上位机有时读取完整,有时不完整。 跟RT_LWIP_TCP_SND_BUF RT_LWIP_TCP_WND 配置大小有关吗
    发表于 11-04 10:38

    ESP32C3编出来的组件静态库不完整是什么原因?

    最近从 ESP32切到了 ESP32C3,发现 riscv编译链编出来的组件不完整——例如 mbedtls组件,之前在 ESP32平台、使用 xtensa编出来的libmbedtls.a有
    发表于 02-15 07:42

    台积电称美国半导体供应链不完整

    台积电公司CEO张忠谋近日表示:美国半导体供应链目前并不不完整,在美国建新厂的成本将比中国大陆高出37%至50%。目前台积电正在美国亚利桑那州厂建厂。
    的头像 发表于 10-28 10:37 1722次阅读

    APM32F091RCT6_SPI_从机接收数据不完整

    APM32F091RCT6_SPI_从机接收数据不完整
    发表于 11-09 21:04 0次下载
    APM32F091RCT6_SPI_从机接收数据<b class='flag-5'>不完整</b>

    浅谈C语言中的三种不完整类型

    不完整类型(Incomplete types)是缺少足够信息来确定该类型对象大小的对象类型不完整类型
    发表于 12-16 09:52 357次阅读

    如何获取ChatGPT回答不完整的内容

    ____tz_zs 对于 ChatGPT 回答不完整的情况(篇幅限制,没有说完),可以输入“继续”指令,让其继续回答下去,获得完整内容。 如下图,发问 “使用web3js 调用 eth链智能合约” 直到这里才是获得了刚刚问题 “使用web3js 调用 eth链智能合约”
    发表于 02-10 10:48 0次下载
    如何获取ChatGPT回答<b class='flag-5'>不完整</b>的内容