(1)声明与定义
C++全局变量的声明和定义
转载wx611f66f2e183a 博主文章分类:Compile&Link
函数或变量在声明时,并没有给它实际的物理内存空间,它有时候可保证你的程序编译通过;
函数或变量在定义时,它就在内存中有了实际的物理空间。
如果你在编译单元中引用的外部变量没有在整个工程中任何一个地方定义的话,那么即使它在编译时可以通过,在连接时也会报错,因为程序在内存中找不到这个变量。
函数或变量可以声明多次,但定义只能有一次。
(2) extern作用
作用一:当它与"C"一起连用时,如extern "C" void fun(int a, int b);,则编译器在编译fun这个函数名时按C的规则去翻译相应的函数名而不是C++的。
作用二:当它不与"C"在一起修饰变量或函数时,如在头文件中,extern int g_nNum;,它的作用就是声明函数或变量的作用范围的关键字,其声明的函数和变量可以在本编译单元或其他编译单元中使用。
即B编译单元要引用A编译单元中定义的全局变量或函数时,B编译单元只要包含A编译单元的头文件即可,在编译阶段,B编译单元虽然找不到该函数或变量,但它不会报错,它会在链接时从A编译单元生成的目标代码中找到此函数。
推荐使用.h中声明,.cpp中定义的做法。
(3)静态全局变量(static)
注意使用static修饰变量,就不能使用extern来修饰,即static和extern不可同时出现。
static修饰的全局变量的声明与定义同时进行,即当你在头文件中使用static声明了全局变量,同时它也被定义了。
static修饰的全局变量的作用域只能是本身的编译单元。在其他编译单元使用它时,只是简单的把其值复制给了其他编译单元,其他编译单元会另外开个内存保存它,在其他编译单元对它的修改并不影响本身在定义时的值。即在其他编译单元A使用它时,它所在的物理地址,和其他编译单元B使用它时,它所在的物理地址不一样,A和B对它所做的修改都不能传递给对方。
多个地方引用静态全局变量所在的头文件,不会出现重定义错误,因为在每个编译单元都对它开辟了额外的空间进行存储。
(4)全局常量(const)
const单独使用时,其特性与static一样(每个编译单元中地址都不一样,不过因为是常量,也不能修改,所以就没有多大关系)。
const与extern一起使用时,其特性与extern一样。
没有坚守就没有事业,没有执着就没有未来!
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
Cocos Creator 3.8游戏开发中全局变量管理方案探索
本文给出Cocos Creator 3.8+Typescript编程环境下,开发一款游戏时如何管理全局变量的可能的解决方案。
全局变量 Cocos Creator Typescript Redux MobX -
python3识别gb18030的模块
【已解决】python中文字符乱码(GB2312,GBK,GB18030相关的问题)【背景】在玩wordpress的一个博客搬家工具BlogMover,其包含几个python脚本,其中有个是163博客搬家用的163-blog-mover.py,实现抓取网易博客的日志,然后导出xml。但是其工具现在(2011-12-10)已经失效了。经过自己一点修改后,可以实现获得文章标题了。用法还是原先的用法:获
python3识别gb18030的模块 python源码编译安装 gb18030 中文字符 编码类 python -
linux系统上如何终止GPUID为0上的程序
大家比较熟悉 Windows 下的可执行文件,就是那些扩展名为exe的文件。大家知道,只需要鼠标双击这些程序, 就可以运行了。程序运行起来后,我们把这个程序正在运行的 实例 称之为 进程 。操作系统对每个进程都分配一个数字标记,称为 进程ID (PID)。Windows进程的信息可以通过 任务管理器看到。如下所示比如上图中,正在运行的计算器程序 Calcul
delphi pid判断进程结束 linux source关闭终端后不生效 linux 定时执行命令 linux 查看pid linux查看pid 对应的程序