定义:
- 定义:为变量分配地址和存储空间
- 声明:不分配地址和存储空间
一个变量可以在多个地方声明,但是只在一个地方定义。加入extern修饰的是变量的声明,说明此变量将在文件或在文件后面部分定义。
1.变量声明
- 作用:告诉编译器“这个变量存在”,并且说明它的类型和名字,但不分配存储空间(特殊情况除外)。
- 特征:
1.不创建内存,只是一个“公告”
2.常见于extern关键字修饰的变量
3.典型使用场景:在头文件 .h 中声明,让其他 .c 文件知道有这个变量。
- 示例:
extern int a; // 声明,告诉编译器 a 在别的地方定义过
2.变量定义
-
作用:真正创建变量,并分配内存空间,可以(也可以不)赋初值。
-
特征:
1.编译器会为它分配存储空间
2.一个变量在整个程序中只能被定义一次(全局变量)。
3.没有extern,且位于函数体外部时,一般就是定义。
- 示例:
int a = 10; // 定义,分配空间,并赋初值 10
3.容易混淆的点
- 没有 extern 的全局变量声明就是定义:
int b; // 在全局范围,这是定义(分配空间,默认初始化为0)
- 局部变量声明就是定义(因为它会分配在栈上):
void func() {
int c; // 局部变量,声明同时定义
}
- 只有声明,没有定义的变量,必须在其他文件中有定义,否则链接时报错。
4.总结对比表
是否分配内存 | 否(除非是局部变量) | 是 |
是否初始化 | 否 | 可以初始化 |
是否唯一 | 可以多次声明 | 在全局范围只能有一次定义 |
常见关键字 | extern | 无 extern,或带初始化 |
场景 | 告诉编译器变量存在 | 真正创建变量并分配空间 |
5.快速记忆
声明是告诉编译器“它有”,定义是告诉编译器“它在这里”并给它空间。
评论前必须登录!
注册