既有适合小白学习的零基础资料,也有适合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)**