当前位置: 首页 >> 程序设计 >> extern与static存储空间矛盾
 

extern与static存储空间矛盾

作者:xulecn      来源:http://blog.csdn.net/xulecn     发表时间:2006-12-03     浏览次数:      字号:    

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. 自由存储区(堆):也称为动态内存。 

编辑 webmaster

 
 
 
评论更多>>
 
 
发表
 
姓名: QQ:
性别: MSN:
E-mail: 主页:
评分: 1 2 3 4 5
评论内容:
验证码:
  
  • 请遵守《互联网电子公告服务管理规定》及中华人民共和国其他各项有关法律法规。
  • 严禁发表危害国家安全、损害国家利益、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容的评论 。
  • 用户需对自己在使用本站服务过程中的行为承担法律责任(直接或间接导致的)。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表网友个人观点,与本网站立场无关。
  •