一、前言
单定义原则:变量只能有一次定义。为此C++提供了定义声明和引用声明extern,extern声明不分配空间,不进行初始化,它引用已有的变量。
小作用域的变量会隐藏大作用域的同名变量
使用new和delete控制的动态内存不适用于此,它们不被作用域和链接性的规则束缚
编译器一般用三块区域控制内存:一块用于静态变量,一块用于自动变量,一块用于动态内存。
二、变量类型
自动变量
在函数中声明的变量,作用域为代码块,没有链接性。
自动变量的数目在程序运行期间会改变,需要使用栈进行动态管理自动变量。函数参数的入栈顺序未定义,允许编译器自由实现。大多从右到左。
静态变量
静态变量的数目在程序运行期间不改变,不需要动态管理。
静态变量的初始化:所有的静态变量都会被零初始化。(然后进行后面的初始化,见文"初始化")
1、外部链接性
全局变量,直接在函数外部声明,在任何源代码文件中都可见。
使用全局变量,需要在一个源代码文件中定义,在其他源代码文件中extern
特别的,在使用const修饰的变量,即常量,的时候,全局变量的链接性变为内部链接性。我们也可以用extern const来使这个常量的链接性为外部链接,并且这么做的话,我们需要在每个源代码文件用到这个变量的地方都使用extern const来声明。(即任何地方都需要使用extern)(如果对理由感兴趣,可以查看C++ Primer Plus第6版261页)
2、内部链接性
在函数外部用static修饰,在本源代码文件中都可见。
会隐藏同名的外部变量。
3、无链接性
局部静态变量,在函数内部用static修饰,在代码块内可见,即使没有执行代码块,变量也在内存中。
只会初始化一次,再次调用函数时,不会再次初始化。
三、函数的链接性
函数(内联函数除外,内联函数的定义可以放在头文件,这样每个包含头文件的源代码文件都有该函数的定义)同样遵守单定义原则。
函数默认为静态,外链接性,可以实现多个源代码文件之间的共享。也可以在函数原型处用extern表示该函数的定义在另一处实现。
用static修饰函数,可以让函数的链接性变为向内,这样就只能在一个文件中使用该函数。