所有的数据都有两种类型:数据类型,存储类型。
数据类型:如int, float等
存储类型:一共有四种存储类型的变量,分别为自动变量(auto)、静态变量(static)、外部变量(extern)以及
寄存器变量(register)
auto - 函数中所有的非静态局部变量。
auto型一般是函数内部定义的变量(常用,且前面不加auto)。
register-不属于内存的一部分,所以不能取地址。一般经常被使用的变量(如一变量要计算几千次)可以
设置成寄存器,register变量会被存在寄存器中,计算速度远快于存在内存中的非register变量。
寄存器变量不能定义为全局变量,一般不需要用register关键字,因为编译器会对变量进行优化。将它存入寄存器。
static-在变量前加上static关键字的变量。
静态变量生命周期和全局变量一致,(局部)静态变量但只能在定义的函数内访问。无论调用几次,只初始化一次。
全局静态变量,定义之后,下面的任意函数都可以访问。
extern-把全局变量在其他源文件中声明成extern变量,可以扩展该全局变量的作用域至声明的那个文件,其本质就是
对全局变量作用域的扩展。
变量的作用域和生存周期
extern int value;是声明,所选中的文件外部若没有定义全局变量value,则报错。 (int i; 这是个定义)
extern int value = 524;同时声明且定义(因为初始化了)。声明和定义是不同的。
ps:全局变量有两种存储类型,static或者extern,若不加关键字,则是extern类型的。
使用extern进行声明(变量)时,不必(即可以继续)再写#include包含源文件(含有定义变量的)。且此声明是必须的。
若有全局变量定义在头文件中,那么包含此头文件就可使用了,无需extern进行声明。
有一种错误:test.h头文件中包含int a; 在一个cpp文件中包含此头文件,直接可以调用a,但是若再此基础上添加一个cpp文件,且仅仅包含test.h头文件,程序就会报错。
将上述情况简化就是,同一个项目下,即使没有交集,若两个文件中定义了相同的(光秃秃的,未进行显示初始化)全局变量,就报错。(解决方法是将任意一个全局变量设为static,可以理解为“隐藏”,也可以加extern进行声明。)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?