作用域描述了名称在文件多大范围内可见。C++ primer plus中还有一个定义是链接性,链接性描述了名称如何在不同文件间共享。其实我个人理解,链接性跟作用域描述的概念差不多,只不过一个是对文件内部可见性(访问)的描述,一个是对文件之间可见性(访问)的描述。
单定义规则,根据网上大部分的描述是,任何变量都只能定义一次,比如定义了int a,不能再重新定义一个int a,只能赋值。这显然是不严谨的,因为我们可以在不同的函数中定义同名的变量。
应该说,任何时候都只能存在一个相对可见的定义。
首先我们先来分析一下各种变量的作用域。
1、自动变量。如果在代码块中定义了变量,则该变量的存在时间和作用域都被限制在了该代码块内,该变量没有链接性。并且,在该代码块内,该变量会隐藏其他在代码块外部定义的同名变量。也就是说在该代码块内部,只有内部的定义是可见的,在代码块外部,只有外部的定义是可见的,所以,在代码块内部定义同名变量并不会违反单定义规则。
2、静态持续变量。静态持续变量的存在时间为整个程序执行期间,但是它的作用域和链接性取决于定义方式,定义方式有如下三种:
2.1、如果在所有函数外面定义一个变量,例如
//file1.cpp
int a;
int main()
{
return 0;
}
那