C/C++ 存储类型 作用域 连接类型

1)存储类型:

标准C语言为变量,常量和函数定义了4种存储类型:extern,auto,static,register.

这4种存储类型可分为两种生存期限:永久的(在整个程序执行期都存在)和临时的(暂时保存在堆栈和寄存器中).

extern和static用来标识永久生存期限的"变量和函数",而anto和register用来标识临时生存期限的"变量".只有变量才有临时生存期限.一个变量和函数只能具有一个存储类型,也只能有一种生存期限.

1`:默认情况下,"全局变量和全局函数"的存储类型是extern,能够被定义在它们之后的同一个编译单元内的函数所调用.如果变量或者函数被显示加上extern声明,那么其他编译单元中的函数也能调用它们.

2`:显示地声明为static的"全局变量和全局函数"具有static存储类型,只能被用一个编译单元内的函数调用.

3`:"局部变量"默认具有auto存储类型,除非用static或register类定义.但是,它们的作用域都是程序块作用域.连接类型都是内连接.在进入函数的时候被创建,函数退出时被销毁.register和auto只能用于声明"局部变量和局部常量";

4`:"全局变量"默认存储类型为static,除非在定义了它的编译单元之外的其他编译单元中显示地用extern声明.否则不能被访问.

5`:"局部符号常量(不是字面常量)"的默认存储类型为auto,除非显示地定义为static或register.

6`:"函数形参"是局部变量,因此与局部变量的存储类型一样.

P.S:

一个程序元素的存储类型与它的作用域,生存期限以及连接类型具有某种微妙的关系,但是一个具有作用域和连接类型的标识符不一定就用存储类型.

2)作用域规则:

作用域就是一个标识符能够起作用的程序范围.在标准C语言中,这些范围包括文件,函数,程序块和函数原型.在标准C++中除了这4中之外,还有两种作用域类型:类和名字空间.其中,名字空间是可以跨文件的.

P.S:

即使局部变量的存储类型声明为static,它仍然具有程序块作用域.

3)连接类型:

连接类型分为外连接,内连接,无连接3种.连接类型表明了一个标识符的可见性.

1`:如果一个标识符能够在其他编译单元中或者定义它的编译单元中的其他范围内被调用,那么它就是外连接的.

2`:如果一个标识符能在定义它的编译单元中的其他范围被调用,但是不能在其他编译单元中被调用,那么它就是内链接的.

3`:一个仅能够在声明它的范围内被调用的名字是无连接的.

参考:

《高质量C/C++编程指南—C/C++语言(第三版)》林锐