static、const和extern分析总结
2019-08-06 本文已影响6人
鲲鹏DP
1.static
1.1 修饰局部变量:改变局部变量的作用域,延长其生命周期直到程序结束
未使用static.png [图片上传中...(未使用static.png-c36ead-1565075572189-0)]1.2修饰全局变量:全局变量变成静态全局变量。
多个类中定义相同全局变量会报duplicate symbol错误
64D9300F25427BFD14FEDCF60DD99F70.png FA2D3EDE1AEA82A885E93A1F8EC08DAA.jpg想要能够在多个类中定义相同全局变量,可以用static修饰,将全局变量变成静态全局变量。静态全局变量可以多文件共存,相互之间独立,互不影响;
1.3 应用实例
-
static修饰局部变量:单例
4689D115C0A07A7A49C3AD506E29CFE6.png - static修饰全局变量:cell重用标识;定义只能自己文件使用的全局常量;
小结:
全局变量与全局静态变量的区别:
(a)若程序由一个源文件构成时,全局变量与全局静态变量没有区别。
(b)若程序由多个源文件构成时,全局变量与全局静态变量不同:全局静态变量使得该变量成为定义该变量的源文件所独享,即:全局静态变量对组成该程序的其它源文件是无效的。
静态全局变量的作用:
(a)不必担心其它源文件使用相同变量名,彼此相互独立。
static
- 改变变量的作用域,有static修饰的变量只分配一次内存空间,程序结束时才会被释放;
- 只用static修饰时,变量只能在当前文件访问,避免相互影响。
2.extern:跨文件引用
2.1 修饰全局变量
.h文件中定义一个extern修饰的全局变量,对应.m文件中也需要对应定义(去掉extern)
5036DA8A99F7D7A71E5B2FE38956AA25.png AF86BF870B7B2A152D06407C1D1CC53D.png跨文件调用时,如果引入定义变量的.h文件,那么可以直接使用全局变量;如果没有引入定义全局变量的.h,那么需要使用extern关键字来调用该变量;
2.2 extern的应用
常与const联合使用,定义一些不可变的全局数据。可以专门定义一个类来管理所有的全局变量,代替宏
3.const:常量
3.1 const位置不同,所得到的结果不同——只修饰右边的。
- const在*号的右边:值是常量不可变,但是地址可以改变;
- const在*号的左边:地址是常量不可变,值可以改变;
3.2 const与宏。
全局的一些常量可以抽成宏,全局使用。但是苹果官方更推荐使用const常量。
- 宏是预编译(编译之前处理),const是编译阶段
- 宏不做检查,不会报编译错误,只是替换,const会编译检查,会报编译
- 使用大量宏,容易造成编译时间久,每次都需要重新替换。
注意:const只能定义一些常量,宏不仅可以定义常量,还可以代替任何的代码块
4.const,extern和static的混合使用;
4.1static与const:全局静态变量,只能文件内部使用,相互之间不影响,根据const的位置,决定当前变量是否可变
/*值可变,地址不可变*/
static NSString const* userCode;
static const NSString * userName;
/*值不可变,地址可变*/
static NSString * const sex;
4.2extern与const :外部全局变量,可以通过extern关键字,在不引入.h文件的情况下,跨文件使用。根据const的位置,决定当前变量是否可变。
/*值可变,地址不可变*/
extern NSString const* userCode;
extern const NSString * userName;
/*值不可变,地址可变*/
extern NSString * const sex;