本文涉及:
C++单定义规则的解释和两种声明变量的方法
变量的持续性( 变量在内存中存在的周期)
作用域的解释,全局和局部作用域,全局和局部变量的解释
存储类的解释,auto,static,extern,register存储类的解释
程序编译的步骤
链接性的解释,外链接,内链接,无链接
变量的链接和作用域实例演示:
各类变量的持续性,链接性和,作用域判断表
前言:
在上一个C++ 命名空间和模块化编程🔍 项目中,我们已经开始创建由多个文件构成的项目,由于多文件导致程序命名空间和变量作用域的混乱,我们需要深入了解更复杂的变量作用域了
单定义规则(One Definition Rule,ODR)
首先因为C++有"单定义规则",此规则指出变量在程序中只能有一次定义.
其次C++提供了两种声明变量的方法:
1.定义声明(原始声明): 即给变量分配存储空间
2.引用声明(extern声明): 即不给变量分配存储空间,因为它只是引用已有的变量,使用关键字extern
声明但不对此变量进行初始化.
引出问题:
在模块化编程的过程中,往往会出现a
文件中的变量需要在b
文件中被调用的情况,此时需要我们在b
文件中再次声明一个同名变量,如果直接定义声明,显然是不符合C++单定义的规则的,所以我们需要使用引用声明
想要正确的引用一个变量的声明,便需要了解这个变量所属的作用域以及其链接属性.
持续性的概念(scope)
持续性就是 变量在内存中存在的周期(即何时被分配内存,何时释放内存)
自动:变量从程序开始执行相关函数或代码块时被创建,执行完函数或代码块时释放
静态:变量在程序整个运行过程都存在
动态:变量在new
分配时被创建,delete
时被释放
作用域(scope)
简单来说,变量作用域就是你可以在什么范围内访问这个变量
作用域:变量是否可见
全局作用域: :(文件) 从声明位置到定义文件的结尾可见
局部作用域: :(代码块) 从声明位置到定义它的代码块的结尾可见
其他作用域:
函数原型作用域: 包含参数列表的括号内可用
类中声明的成员的作用域: 整个类
命名空间中声明的变量的作用域: 整个命名空间
全局变量和局部变量:
全局变量 :一个在所有函数之前定义的变量可以在任何一个函数使用.
全局变量意味着所有函数都能访问,这其中的好处是省去了函数传递参数时的麻烦.
同时由于全局变量的易访问性质,意味可能出现对数据进行了不必要的访问,导致程序的不可靠.
局部变量:而在某个函数里定义的变量只能在那一个函数里使用
上述规则完全适用于单个源文件编译时的情况.那么,当一个项目由多个文件构成时,变 量 的 作 用 域也会受到一定的影响!
存储类(storage class)
每个变量都有一个存储类,存储类决定着程序将把变量的值存储在计算机的位置,存储的方式,以及此变量应该有着怎么样的