C C++_的不完整类型详解(参考了各位大佬整理下来,特此鸣谢)_不允许使用不完整的类型什么意思(1)

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

如果你需要这些资料,可以戳这里获取

声明(引用声明):告诉编译器这个类型已经存在,但此时编译器并不知道需要给该类型的对象分配多少字节的内存。

定义(定义声明):描述了该类型的细节,编译器由此可以知道需要给该类型的对象分配多大的内存。

换句话说,不完全类型的定义 就是 尚未定义完全的类型。(编译器尚不知道给该类型对象分配多大内存)

在C/C++,不完全类型的表现形式有这几种 void未指定长度的数组 以及 具有非指定内容的结构和联合

void比较特殊,因为它是内置的不完全类型,用户无法通过定义完整,使得编译器知道该类型对象该分配多大内存。并且void应用的场合也仅是特殊函数的返回值和参数。(eg :malloc() )

class a;
union b;
int c[];

在此时,以上类型 a, b,c 都是不完全类型。

如果 紧接着 定义该类型的对象使用该类型都是错误的

class a;
union b;
int c[];

a test_class;//错误,编译器不知到给test_class分配多大内存
b test_union;//错误,编译器不知到给test_union分配多大内存
auto test_int = sizeof(c);//错误,编译器尚未给test_int分配内存,报错不允许使用不完整的类型
切记,在使用该类型或定义该类型的对象,一定确保该类型已经被定义过了。

但 不完全类型 允许 如下操作
  • 指向不完全类型的指针 (指针所占内存大小确定,32机器 4个字节, 64位机器8个字节,因此编译器可直接创建)
  • 不完全类型的引用        ( 引用类型不占储存单元,因此可以创建)
  • 不完全类型的 typedef 名称
  • 返回不完全类型的函数        (eg:void test()  {return f();}   说明: f() 在 test() 之前只有声明没有定义)
  • 不完全函数参数类型            (eg: void test( int , int&)      说明:声明test()时没有指定形参名字)

上面比较特殊的是函数,用这样一句话解惑

函数在被声明之后,定义之前。被调用是合法且有效的。

二、不完全类型出现的场景

1.普通场景,在全局中声明了该类型而未进行定义时,进行定义该类型的对象和使用该类型(eg:参见定义讲解)

2.在两个结构相互包含对方类型的对象

class b;

class a
{
public:b test_b;
};

class b
{
public:a test_a;

};

class a 中的定义 便会报错 不允许使用不完整的类型

相对的class b中的定义不会出错,因为 在执行 a test_a;前 class a已经定义完整。

3.某class的友元使用了该class定义对象,但是该class的友元定义在该class之前。

class a;
void test()


![img](https://img-blog.csdnimg.cn/img_convert/031c11398948d4c75c4d3277eeef50f2.png)
![img](https://img-blog.csdnimg.cn/img_convert/5963cf41bcb0ee2a0ab085fc64309945.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新**

**需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**

大纲路线、电子书籍、讲解视频,并且后续会持续更新**

**需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值