含有存储类型符的变量定义语句格式如下:
存储类型符 数据类型符 变量名1,变量名2, ... ...
变量的存储类型:
自动型(auto) 存储区域:内存堆栈区 (系统默认内部变量为auto)
寄存器型 ( register ) 存储区域:CPU的通用寄存器 (一般C语方允许定义二个左右为宜) [一般在函数中定义(内部变量)]
静态型( static ) 存储区域:内存的数据区 ( 在程序开始时就分配了固定的内存,程序结束时才释放内存 )
外部参照型 ( extern ) 专用于多个编译单位数据传送。
外部参照型变量不允许进行初始化,其它的可以进行初始化。
变量的生存周期和作用域:
变量的生存期
变量的作用域(变量可以使用的程序区域)
外部变量与内部变量(从变量定义位置来划分)
全局变量和局部变量(从变量的生存周期来划分)
几点说明:
外部变量只能定义为无存储类型或静态型
被说明为static存储型的内部变量是全局变量,在整个程序运期存都存在,它的作用域只是所定义的函数或复合语句
外部变量是不能重命名的,内部变量可以在不同的函数或复合语句中重命名,包括static存储类型的内部变量(因为它们彼此的作用域是不同的)。
外部变量总是全局变量
外部静态变量/函数
在C中static有了第二种含义:用来表示不能被其它文件访问的全局变量和函数。, 但为了限制全局变量/函数的作用域, 函数或变量前加static使得函数成为静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件(所以又称内部函数)。注意此时, 对于外部(全局)变量, 不论是否有static限制, 它的存储区域都是在静态存储区, 生存期都是全局的. 此时的static只是起作用域限制作用, 限定作用域在本模块(文件)内部.
使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。
示例程序:
//file1.cpp
static int varA;
int varB;
extern void funA()
{
……
}
static void funB()
{
……
}
//file2.cpp
extern int varB; // 使用file1.cpp中定义的全局变量
extern int varA; // 错误! varA是static类型, 无法在其他文件中使用
extern vod funA(); // 使用file1.cpp中定义的函数