[转]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. 自由存储区(堆):也称为动态内存
[转]extern,static存储空间矛盾的更多相关文章
- const extern static 终极指南
const extern static 终极指南 不管是从事哪种语言的开发工作,const extern static 这三个关键字的用法和原理都是我们必须明白的.本文将对此做出非常详细的讲解. co ...
- (转)全局变量、extern/static/const区别与联系
全局变量.extern/static/const区别与联系 编译单元(模块): 在IDE开发工具大行其道的今天,对于编译的一些概念很多人已经不再清楚了,很多程序员最怕的就是处理连接错误(LIN ...
- extern static const abstract virtual
extern static const abstract virtual const const.常量,初始化过后值不能再变化的变量.
- extern static和函数
#include <stdio.h> int sum(int a, int b); int main() { /************************************** ...
- OC中的extern,static,const
const的作用: const仅仅用来修饰右边的变量(基本数据变量p,指针变量*p). 被const修饰的变量是只读的. static的作用: 修饰局部变量: 1.延长局部变量的生命周期,程序结束才会 ...
- Objective-C中的const ,extern,static
一.const 1>对于const,记住关键的一点,它只是修饰右边的变量. 例如: - (void)viewDidLoad { [super viewDidLoad]; // const两种用法 ...
- OC中extern,static,const的用法
1.const的作用: const仅仅用来修饰右边的变量(基本数据变量p,指针变量*p). 例如 NSString *const SIAlertViewWillDismissNotification; ...
- extern、static、auto、register 定义变量的不同用法
首先得说明什么叫“编译单元”.每个 .c 文件会被编译为一个 .o 文件,这个就是一个编译单元.最后所有的编译单元被链接起来,就是一个库或一个程序. 一个变量/函数,只要是在全局声明的,链接之后都隐含 ...
- 《OOC》笔记(1)——C语言const、static和extern的用法
<OOC>笔记(1)——C语言const.static和extern的用法 C语言中const关键字用法不少,我只喜欢两种用法.一是用于修饰函数形参,二是用于修饰全局变量和局部变量. 用c ...
随机推荐
- Java对象引用
1.对象的强.软.弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有对象处于可触及(reachable)状态,程序才能使用它.从JDK ...
- mschedule 简单linux进程管理(树莓派)
树莓派是神奇的机器,CPU和内存都少的可怜,但体积小功耗低,在上面搞些动搞些西其实也挺有意思,挺好玩的.装的是pidara,基本服务没有精简多少,先cat一下CPU和RAM. [able@raspi ...
- C++ 常用的字符串处理函数实现
以下是一些标准库没有实现的函数,我觉得很方便就写了,估计会不定时更新. //根据一个文件的路径获取文件名 std::string file_name(const std::string& pa ...
- iconv内容,convmv文件名,unix2dos,dos2unix文件格式转换,od/cut/wc/dd/diff/uniq/nice/du等命令,linux文件名乱码,文件名,文件内容,vim编码设置
1.enconv文件名编码转换,比如要将一个GBK编码的文件转换成UTF-8编码,操作如下 enconv -L zh_CN -x UTF-8 filename enconv -L GB2312 -x ...
- POJ2253 Frogger(最短路)
题目链接. 题意: 从0号点,到1号点,找一条能通过的路,使得这条路中的最大的边,比其它所有可能的路中的边都小. 分析: 这题就是按着dijkstra写,写着写着觉得像是prim了. 其中d[n]表示 ...
- 一个强大的LogParser的UI工具--logparserlizard简介(开源IIS日志分析工具)
原文地址:http://blog.csdn.net/downmoon/article/details/4509513 日志分析,特别是IIS日志,一般人都会想到LogParser工具,的确很强.但是命 ...
- Java学习日记-2.1 运算符
1. 赋值运算符 赋值运算符是有值的 int i; System.out.println(i = 5); //输出5 正因为赋值运算符有值,所以可以可以连等地赋值 int j,k,l,m,n; j = ...
- Spring 整合 Tibco EMS
参考文档: http://haohaoxuexi.iteye.com/blog/1893038 http://www.blogjava.net/chenhui7502/archive/2011/08 ...
- JavaScript MVC 框架[转载]
MVC,MVP 和 MVVM 的图示 http://www.ruanyifeng.com/blog/2015/02/mvcmvp_mvvm.html http://blog.nodejitsu.com ...
- 零基础学习IOS开发(二)- 使用cocos2d-x3.0 执行Hello world
关于开发框架,依据网上检索来的信息,感觉cocos2d-x的ios游戏开发框架非常不错,并且有非常强的可移植性,因此打算尝试一下. 截止写下此文章,最新的cocos2d-x的版本号为v3.0稳定版(几 ...