C语言中的不完整类型是什么

前述c语言中存在这样一种类型,名叫不完整类型(incomplete types),虽然我们可能不太理解,或许也没有仔细研究过,但是在实际的编程中,我们却已经用到过很多次了。
接下来我们就共同学习一下,内容比较简单,一看就懂,一学就会。
不完整类型不完整类型(incomplete types)是缺少足够信息来确定该类型对象大小的对象类型,不完整类型可以在翻译单元的某些点完整。
听起来可能比较绕口,简单来说就是,不完整类型是不知道对象所占空间大小,此时是无法使用sizeof()的。但是可以通过后续再补充完整。
不完整类型主要有下面三种。
已声明但未定义的类类型内容未知的结构体或联合体类型。在同一作用域的后面,定义同一结构体或联合体的内容的声明能使之完整。
struct node { struct node *next; // struct node 在此点不完整}; // struct node 在此点完整未知边界数组简单来说就是大小未知的数组,之后指定大小的声明能使之完整,接下来看一个示例。
#includeextern 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/typehttps://en.cppreference.com/w/cpp/language/typeend

智能光照培养箱在实验室中的作用是什么
在i.MX RT10XX系列平台上进行OTA
英创信息技术WinCE主板多网络优先级设置介绍
python怎么设置循环次数
无线麦克风电路图
C语言中的不完整类型是什么
芯讯通携手通则康威开发5G FWA CPE等多形态数据终端产品
工程师接私活的创业陷阱
2025年AI或将建立新的社会形态 我们也应该积极探索追随潮流
运动耳机选择哪种好,蓝牙耳机运动无线耳机排名
LM1876电桥输出音频功率放大电路
大气负氧离子监测系统介绍
如何选择8位、16位、32位MCU中合适的器件
圆柱电芯常温化成分容充放电设备
荣耀9什么时候上市最新消息:华为荣耀9渲染图曝光!麒麟960+正面指纹+取消耳机孔 酷似小米6
酷派大神F1高清拆机过程图集
iPhone11暗夜绿为什么大火
二次线路控制电路线的编号原则
从IMU与地磁传感看融合导航
台积电3nm工艺正按计划推进