解决extern和static存储空间矛盾的方法
解决extern和static存储空间矛盾的方法
extern,static存储空间矛盾其实,这两个语句的位置不同,会出现不同的解释。这主要是由于 static 具有的两重意义所导致的:
(1) 如果 static int foo; 这一句位于函数中,则 static 表示的是存储属性,表明 foo 是一个静态变量。
(2) 如果 static int foo; 这一句位于函数外面,则 foo 是一个全局变量,static 不再是表示存储性质,而是作为限制符来使用:用来限制全局变量 foo 的可见范围,将其作用域限制于所在的文件内,在其它文件中是不可见的。
楼主所说的用编译器出错的情况应该是这两句都位于函数外面的情况。在这种情况下
extern int foo;
static int foo;
先声明变量的存在,再定义变量。在 extern int foo; 之前还没有遇到其定义,故 foo 的定义可能出现在这个文件后面或者在其它文件中,因此期望 foo 的作用范围不能仅仅局限于本文件,即不能是 static 全局变量。这就与下面给定的 foo 的定义相矛盾:由于定义语句缩小了被声明的 foo 的作用范围(只局限在本文件中)从而导致声明和定义不一致。
出现的先后顺序不一样,出现的编译信息也不同。例如,如果是下面的情况
static int foo;
extern int foo;
即先定义后声明。此时,声明将遵从定义的规定,继承定义变量的一切属性。
从总体上程序的内存空间可分为代码区和数据区。
从C++的角度来看数据区又可作如下划分:
1. 自动存储区(栈):自动(局部)变量、寄存器变量、临时对象以及函数参数。
2. 静态存储区:全局对象、函数中的静态变量、类中的静态数据成员、常量字符串以及 namespace 变量。
3. 自由存储区(堆):也称为动态内存。