2023年8月28日,周一下午
研究了一个下午才彻底弄明白...
写到晚上才写完这篇博客。
目录
- 声明和定义的根本区别
- 结构体的声明和定义
- 声明结构体
- 定义结构体
- 类的声明和定义
- 函数的定义和声明
- 声明函数
- 定义函数
- 变量声明和定义
- 声明变量
- 定义变量
声明和定义的根本区别
我认为声明和定义的根本区别在于:
同类型的一个标识符可以被重复声明多次,但只能被定义一次。
简单来说,声明可以重复多次,但定义只能进行一次。
和分不分配内存没有关系。
结构体的声明和定义
声明结构体
struct student;
可以看到,我声明了两次结构体student,VS2022没有报错
定义结构体
结构体的定义只是对结构体类型的描述,并不会为其分配内存。
要使用结构体,需要定义结构体变量,并为其分配内存空间。
struct student {
int age;
};
可以看到,定义了两次结构体student后,VS2022报错
类的声明和定义
因为与结构体的声明和定义一模一样,故不再赘述。
函数的定义和声明
声明函数
int max(int num1, int num2);
可以看到,我声明了两次函数max,VS2022没有报错
定义函数
当定义函数时,并没有为函数本身分配内存。
在编译和链接的过程中,函数的定义会被转换成机器代码,并存储在可执行文件中。当程序运行时,操作系统会为程序分配内存,并将函数的机器代码加载到内存中供程序执行。
int max(int num1, int num2) {
return num1 > num2 ? num1 : num2;
}
可以看到,定义了两次函数max后,VS2022报错
变量声明和定义
声明变量
在我看来,声明变量只有一种方法:那就是使用extern且不赋值。
因为,这是我所知唯一允许多次重复声明的情况。
此外,这种情况下不会分配内存。
extern type name;
extern int x;
extern student s1;
可以看到,我声明了两次int类型的变量x后,VS2022没有报错
定义变量
在我看来,这三种情况都属于定义变量。
因为这三种情况不允许重复,只能进行一次。
此外,这三种情况都会被分配内存。这是和上面提到的完全不一样的,上面提到过的都不会在定义时分配内存。
extern type name=value;
type name;
type name=value;
extern int x=1;
int x;
int x=1;
可以看到,这三种情况都不允许多次定义。