在深入详解C/C++中的全局变量和静态局部变量(上)中我们介绍了编译器选项/FA、Data Segment、BSS SEGMENT等内容,以及全局变量与Data Segment、BSS SEGMENT的关系。本文将继续进行静态全局变量和静态局部变量的介绍。
静态全局变量
在声明全局变量的时候可以加上static关键字,使这个全局变量只能用于定义其的文件,解决了多个文件中不能使用同名全局变量的问题。
static double d = 1.0;
static float f = 1.0;
int a = 1;
char c = 1;
这里我们把前面两个变量声明为静态的全局变量,编译后打开a.asm文件:
PUBLIC ?a@@3HA ; a
PUBLIC ?c@@3DA ; c
_DATA SEGMENT
_d DQ 03ff0000000000000r ; 1
_f DD 03f800000r ; 1
?a@@3HA DD 01H ; a
?c@@3DA DB 01H ; c
_DATA ENDS
可以看到PUBLIC部分少了声明为static的全局变量,在DATA SEGMENT中多了个_d和_f,这个是对d和f进行初始化的情况,如果不进行初始化,在a.asm中d和f就彻底消失了(问:咦,那到底哪去了呢?知蚁:别问我,我也不知道!)
静态局部变量
看完了全局变量,我们顺便来看看静态全局变量,看看它存在什么地方的。
#include “stdio.h”
void main()
{
static int e = 3;printf(“e=%d”,e);
}
来段很简单的代码就可以了,编译,查看asm文件,原来是在DATA SEGMENT中啊,具体如下:
_DATA SEGMENT
_?e@?1??main@@9@4HA DD 03H
_DATA ENDS
这个名字就改的更丑了,还好是给机器看的,不是给我们看的!
如果在声明e的时候不进行初始化,那么你就会在BSS SEGMENT中找到被改名后的静态局部变量e了。
_BSS SEGMENT
_?e@?1??main@@9@4HA DD 01H DUP (?)
_BSS ENDS
结语
总算是写完了,希望能通过这些介绍,让你能更加的了解C/C++中的全局变量,只有了解个中原委用起来才能得心应手,最后祝大家过个愉快的端午节!
原创文章请注明转载于知蚁博客,本文地址:http://www.letuknowit.com/archives/89
过来看看了 呵呵 支持一下
c++深奥的东西 不过现在不得不学习 考试啊
有机会最好还是好好学下的比较好
不错啊。。。。。。。。。
感叹我的C++啊。 学的真的不好。
你才大一,还可以慢慢学的嘛
这东东具体有什么作用呢?
是指的C++还是全局变量啊?
说得蛮不错的
来看下 呵呵
应该整个中篇的。
来个
上 中 下。。。
呵呵,貌似整个中,下就没得写了
怎么可能嘛。。把 字写大点。写少点。中 不就出来了?
节日快乐!
节日快乐,(*^__^*) 嘻嘻……!
完全看不懂啊!呵呵
看看,,学习一下