摘要:静态变量的特点,深入理解静态变量全局静态变量数据存储:已初始化的存储在数据区中的已初始化变量区。未初始化的存储在数据区中的未初始化变量区。作用域:文件作用域。本质:是受编译器按语法约束的全局变量。作用:私有化某些变量和方法,以文件为单位对源...
#include <stdio.h>#include <stdlib.h> void TestLocal(){ static int nTest1 = 0x996; printf("%d\r\n",nTest1);} int main(){ TestLocal(); system("pause"); return 0;}
_?nTest1@?1??TestLocal@@9@9将其局部静态变量放入函数内的代码块中,编译后观察名称粉碎的变化:void TestLocal(){ { static int nTest1 = 0x996; printf("%d\r\n",nTest1); }}
_?nTest1@?2??TestLocal@@9@9可以看到由?1变成了?2这里大致可以推测,?x表示层级。全局静态变量不进行名称粉碎不影响从标识符到内存地址的识别,局部静态变量不名称粉碎会影响。编译器通过名称粉碎的方式做语法检查,关键是集成了变量名、作用域名、作用域的层级编号。局部静态变量只能被赋一次初值的原因
上述代码是给编译器看的,告诉编译器全局变量的snTest的初值为999。静态局部变量定义处没有产生赋值的汇编代码,所以在函数执行时不会被赋值。局部静态变量初始化为常量的值
静态局部变量如果赋初值,则会和已初始化的全局变量一样被写入到文件中,存储在数据区中的已初始化的全局变量区。如果未赋初值,则会存储在未初始化的全局变量区,都不会产生赋值的汇编指令。局部静态变量初始化为变量的值
void fooD(int n){ static int nTest = n;}
在C编译器下报错error C2099: initializer is not a constantc++的语法允许局部静态变量初始化为变量的值,c语言不允许。调用方式、返回值、函数参数、及函数参数的数量均会影响到其名称粉碎规则的改变。_?nTest1@?1??TestLocal@@YAXH@Z@4HAVC++6.0 Debug中watch窗口解析名称粉碎bugwatch窗口用的C编译器的名称粉碎规则,所以其无法正常显示cpp文件中的局部静态变量信息。当静态局部变量赋初值为变量时,储存在未初始化区,会产生代码。
本文地址:百科问答频道 https://www.neebe.cn/wenda/931319_3.html,易企推百科一个免费的知识分享平台,本站部分文章来网络分享,本着互联网分享的精神,如有涉及到您的权益,请联系我们删除,谢谢!