C语言数据存储类型
链接性、作用域和生命周期
作用域:一个变量可以被引用的范围
生命周期:这个变量可以访问的时间段
链接性:多个文件间的数据共享
特殊情况
手动分配的内存(new/delete)需要自己管理,以下分类不包括此种
const类型一般(也是最好)都放在头文件,以下分类不包括此种
全局变量
声明在所有代码块之外,在程序运行期间一直存在,整个文件都可访问
具有外部链接性,需要引用外部变量的文件中用extern声明
如果两个文件都声明了相同名称的全局变量会造成链接错误
当需要链接外部文件的变量的时候:关于如何正确使用extern
不带 extern 的变量声明有且必须只能有1份,这个变量的「实际存储位置」也就是在「其所在的文件」中
带 extern 的是从外部导入变量,可以有任意多个,extern的「导入声明」是可以放在头文件里面的
一种优雅(我喜欢)的写法是:
头文件用宏控制
有XXX_DATA的宏:int xxx;
没有XXX_DATA的宏:extern int xxx;
这样变量声明全都在头文件里面完成了,CPP中不用声明变量,又都可以使用这个变量
注意还是要为这个变量分配空间:在某一个CPP文件中,定义XXX_DATA再include这个头文件(这个顺序很重要)
我有很多项目都用了这个技巧,可以翻旧代码看看:
-
全局静态变量
声明在所有代码块之外,在程序运行期间一直存在,整个文件都可访问
没有外部链接性,不会和同名的、有外部链接性的全局变量冲突
局部变量
声明在代码块内部,只在代码块内部可见,没有链接性
代码块结束即被注销
局部静态变量
声明在代码块内部,只在代码块内部可见,没有链接性
在程序运行期间一直存在,初始化只会被执行一次
可见性
其他:大规模的静态/全局数据
// 尚未测试
// 默认 x86_64 模型只能处理低于 2 GB 的静态/全局数据。你可以通过以下命令
// 告诉 GCC 用 medium memory model,支持更大的全局或静态数据区域
-Xcompiler -mcmodel=medium
// 因为这里用的是nvcc,所以使用了-Xcompiler将参数传递给原C编译器