Zhonghui

每个不曾起舞的日子,都是对生命的辜负

User Tools

Site Tools


程序:c:存储类型

C语言数据存储类型

链接性、作用域和生命周期

  • 作用域:一个变量可以被引用的范围
  • 生命周期:这个变量可以访问的时间段
  • 链接性:多个文件间的数据共享

特殊情况

  • 手动分配的内存(new/delete)需要自己管理,以下分类不包括此种
  • const类型一般(也是最好)都放在头文件,以下分类不包括此种

全局变量

  • 声明在所有代码块之外,在程序运行期间一直存在,整个文件都可访问
  • 具有外部链接性,需要引用外部变量的文件中用extern声明
  • 如果两个文件都声明了相同名称的全局变量会造成链接错误

当需要链接外部文件的变量的时候:关于如何正确使用extern

  1. 不带 extern 的变量声明有且必须只能有1份,这个变量的「实际存储位置」也就是在「其所在的文件」中
  2. 带 extern 的是从外部导入变量,可以有任意多个,extern的「导入声明」是可以放在头文件里面的
  3. 一种优雅(我喜欢)的写法是:
    1. 头文件用宏控制
    2. 有XXX_DATA的宏:int xxx;
    3. 没有XXX_DATA的宏:extern int xxx;
    4. 这样变量声明全都在头文件里面完成了,CPP中不用声明变量,又都可以使用这个变量
    5. 注意还是要为这个变量分配空间:在某一个CPP文件中,定义XXX_DATA再include这个头文件(这个顺序很重要)
    6. 我有很多项目都用了这个技巧,可以翻旧代码看看:

全局静态变量

  • 限定词static
  • 声明在所有代码块之外,在程序运行期间一直存在,整个文件都可访问
  • 没有外部链接性,不会和同名的、有外部链接性的全局变量冲突

局部变量

  • 声明在代码块内部,只在代码块内部可见,没有链接性
  • 代码块结束即被注销

局部静态变量

  • 限定词static
  • 声明在代码块内部,只在代码块内部可见,没有链接性
  • 在程序运行期间一直存在,初始化只会被执行一次

可见性

  • 内部的声明会掩盖外部/全局的声明(就近原则)

其他:大规模的静态/全局数据

// 尚未测试

// 默认 x86_64 模型只能处理低于 2 GB 的静态/全局数据。你可以通过以下命令
// 告诉 GCC 用 medium memory model,支持更大的全局或静态数据区域
-Xcompiler -mcmodel=medium
// 因为这里用的是nvcc,所以使用了-Xcompiler将参数传递给原C编译器
/var/www/DokuWikiStick/dokuwiki/data/pages/程序/c/存储类型.txt · Last modified: 2025/07/15 06:29 by zhonghui