资源描述:
《关于static和extern变量的一些总结》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、static关键字是C,C++中都存在的关键字,它主要冇三种使用方式,其中前两种只指在C语言中使用,第三种在C++屮使用(C,C卄中具体细微操作不尽相同,木文以C++为准).(1)局部静态变量(2)外部静态变量/函数⑶静态数据成员/成员函数下面就这三种使用方式及注意事项分别说明一、局部静态变量在C/C++11',局部变量按照存储形式
2、
3、J分为三种auto,static,register(vC语言程序设计(第二版)>谭浩强,第174J75页)与auto类型(普通)局部变量相比,static局部变量冇三点不同1.存储空间分配不同a
4、uto类型分配在栈上,属于动态存储类别,占动态存储区空间,函数调川结束后自动释放,而static分配在静态存储区,在程序整个运行期间都不释放.两者之间的作用域相同,但生存期不同.2.static局部变量在所处模块在初次运行时进行初始化工作,且只操作一次3.对于局部静态变最,如果不赋初值,编译期会自动赋初值0或空字符,而auto类型的初值是不确定的.(対于C卄中的classXJ-象例外,class的对象实例如果不初始化,则会自动调用默认构造函数,不管是否是static类型)特点:static局部变量的”记忆性”与生存期的”全局性
5、”所谓”记忆性”是指在两次函数调用吋,在第二次调用进入吋,能保持第一次调用退出吋的值.示例程序一#includeusingnamespacestd;voidstaticLocalVar(){staticinta=0;//运行期时初始化一次,下次再调用时,不进行初始化工作cout«"a="«a«cndl;++a;}intmain(){staticLocalVar();//第一次调用,输出a=0staticLocalVar();//第二次调用,记忆了第一次退出时的值,输出a=lreturn0;}应用:利卅”记忆
6、性”,记录两数调用的次数(示例程序一)利用生存期的”全局性”,改善”returnapointer/referencetoalocalobject”的问题.Localobject的问题在于退出函数,生存期即结束,.利用static的作用,延长变量的生存期.示例程序二://IPaddresstostringformat//UsedinEthernetFrameandIPHeaderanalysisconstchar*IpToStr(UINT32IpAddr){staticcharstrBuffL16J;//static局部变量,用
7、于返回地址有效constunsignedchar*pChIP=(constunsignedchar*)&lpAddr;sprintf(strBuff,n%u.%u.%u.%uM,pChlP[0],pChIP[l],pChIP[2],pChIP⑶);returnstrBuff;}voidfun(inti){staticintvaluc=i++;cout«value«endl;}intmain()fun(O);fun(l);fun(2);return0;}输岀00()你知道是为什么!注意事项:1.“记忆性”,程序运行很重要的一点就
8、是可重复性,而static变量的”记忆性”破坏了这种可重复性,造成不同时刻至运行的结果可能不同.2.“生存期”全局性和唯一性.普通的local变量的存储空间分配在stack±,因此每次调用函数时,分配的空间都可能不一样,而static具有全局唯一性的特点,每次调用时,都指向同一•块内存,这就造成一个很重要的问题--不可重入性!!!这样在多线程程序设计或递归程序设计中,耍特別注意这个问题.(不可重入性的例子可以参见<eifectiveC++(2nd)>(影印版)笫103-105页)卜-面针对示例程序二,分析在多线程情况卜•的不安
9、全性.(为方便描述,标上行号)①constchar*IpToStr(UINT32IpAddr)②{①staticcharstrBuff[16J;//static局部变量,用于返回地址有效②constunsignedchar*pChIP=(constunsignedchar*)&IpAddr;③sprintf(strBuff,"%u.%u.%u.%un,pChIP[0],pChIP[1],pChIP[2],pChIP⑶);④retumstrBuff;⑤}假设现在有两个线程A,B运行期间都需要调用IpToStr()函数,将32位的
10、1P地址转换成点分10进制的字符串形式.现A先获得执行机会,执行IpToStr(),传入的参数是0x0B090A0A,顺序执行完应该返回的指针存储区内容是:”10.10.9.11”,现执行到⑥时,失去执行权,调度到B线程执行,B线程传入的参数是0xA8A8A8C0,执行至⑦,