关于static全局变量
在DSP的C编程中,定义的static全局变量,为什么在.map文件里看不到分配空间?static全局变量是动态变量还是静态变量?
如果是静态,为什么在.map文件里没有分配地址?
static 变量的
1,作用域为整个文件,
或是{....}之内
2,它的生命周期为整个程序的生命周期。
关于你的这个问题:
这个变量名在编译的时候被编译器变换了变量名。
试想,如果在两个.c文件中都存在以下定义:
A.c中
static int jj;
B.c中
static int jj;
如果编译器,定义了一个变量名为 jj, 那这个jj究竟是A.c还是B.c的,
这时,编译器就会使用一个技巧,就是给他们名字扩展,比如:
A.c 中的jj, 改为了 jj_A
B.c 中的jj, 改为了 jj_B
所以,变量还是存在的,只是被改名了,你仔细再看一下map
我是在一个文件的开始定义了一个static全局变量,则这个变量的作用域只在该文件内,而其它文件内也没有与之同名的变量名,编译后在.map文件中看不到为该变量分配地址。
谁来解释?
事实上,即使不存在重名的static变量名,编译器都会将其改名。我手边没有环境,没法试,你可以用一下方法来找一下:
1,比方定义了一个static 变量:
statc int jj;
2, 取得该变量的地址,如在函数中
int * p_jj;
p_jj= &jj;
单步跟踪得到jj的地址。
2,利用得到的地址,去由工程生成的 .map文件中看该地址究竟分配了什么变量名。
.map中的格式如下:
address name
-------- ----
00000000 ___data__
00000000 ___edata__
00000000 edata
00000000 .data
00000400 __STACK_SIZE
00000880 _DevEmuRegs
00000a80 _FlashRegs
00000ae0 _CsmRegs
00000b20 _XintfRegs
00000c00 _CpuTimer0Regs
00000c08 _CpuTimer1Regs
另外,我还有一个怀疑,是不是该变量被编译器优化掉了。
我怀疑是不是变成了动态地址?