换句话说,不完全类型的定义 就是 尚未定义完全的类型。(编译器尚不知道给该类型对象分配多大内存)
在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()
{
a x;
}
class a
{
friend void test();
private:
int b= 2;
};
三、不完全类型带来的好处(什么时候该用不完全类型)
1.提高代码的灵活性
char str[];
char str[10];
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新