赞
踩
1.无论何时设计一个包含静态变量的函数,都需要注意多线程问题
2.静态对象(包括局部静态对象和全局静态对象)的析构函数在程序从main中退出,或者是标准的C库函数exit被调用时才调用。多数情况下main函数的结尾也是调用exit来结束程序的,这就意味着在析构函数内部使用exit函数是很危险的,因为这样会导致无穷的的递归调用。但如果用标准的C库函数abort来退出程序,静态对象的析构函数并不会调用
3.可以用标准C库函数atexit来指定当程序跳出mian,或调用exit时应执行的操作。在这种情况下,在跳出main或者调用exit之前,用atexi()t注册的函数可以在所有的对象的析构函数调用之前被调用
4.和普通对象的销毁一样,静态对象的销毁也是按照与初始化相反的顺序进行的
5.静态全局变量是内部链接的,内部链接的好处是可以将这个东西放在一个头文件中而不用担心链接时发生冲突。一般来说,放在头文件中的名字,如常量、内联函数、在默认情况下都是内部链接的
注:常量在C中默认是外部链接的,在C++中默认是内部链接,如果想让const量变成外部链接,需要加extern,并且在定义时如果没有赋初值,则这个“定义”实际上是一个申明
6.所有的全局对象都是隐含为静态存储的(存放在静态存储区),如果不使用static关键字,则这个全局对象对所有的翻译单元都是可见的
文件作用域的int a=0等同于extern int a=0,都是定义一个外部连接性的静态数据区成员
文件作用域的static int a=0,是定义一个内部连接性的静态数据区成员
extern void f()等同于void f()
所以需要注意“static”与“静态”多种映射,对于在文件作用域的全局变量以及函数,static是改变其可见性,而对于局部变量,static改变的是存储类型
7.与static既能应用于全局变量也能应用于局部变量不同,关键字auto和register都只能应用于局部变量,不过这两个关键字都有点多余,因为编译器总是能从变量定义时的上下文判断出这是一个局部变量,并且编译器在优化代码方面也做得很好
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。