static、const和extern分析总结

作者: 鲲鹏DP | 来源:发表于2019-08-06 19:22 被阅读6次

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重用标识;定义只能自己文件使用的全局常量;
1080BC55-8B91-402D-B521-D1824CF46964.png

小结:

全局变量与全局静态变量的区别:

(a)若程序由一个源文件构成时,全局变量与全局静态变量没有区别。
(b)若程序由多个源文件构成时,全局变量与全局静态变量不同:全局静态变量使得该变量成为定义该变量的源文件所独享,即:全局静态变量对组成该程序的其它源文件是无效的。

静态全局变量的作用:
(a)不必担心其它源文件使用相同变量名,彼此相互独立。

static

  • 改变变量的作用域,有static修饰的变量只分配一次内存空间,程序结束时才会被释放;
  • 只用static修饰时,变量只能在当前文件访问,避免相互影响。

2.extern:跨文件引用

2.1 修饰全局变量

.h文件中定义一个extern修饰的全局变量,对应.m文件中也需要对应定义(去掉extern)

5036DA8A99F7D7A71E5B2FE38956AA25.png AF86BF870B7B2A152D06407C1D1CC53D.png

跨文件调用时,如果引入定义变量的.h文件,那么可以直接使用全局变量;如果没有引入定义全局变量的.h,那么需要使用extern关键字来调用该变量;

3772DFE2CDE6305829E9C1B48577A6AC.png
2.2 extern的应用

常与const联合使用,定义一些不可变的全局数据。可以专门定义一个类来管理所有的全局变量,代替宏

20FF59A0-12B9-4275-88B4-5A54796393A2.png

3.const:常量

3.1 const位置不同,所得到的结果不同——只修饰右边的。
  • const在*号的右边:值是常量不可变,但是地址可以改变;
  • const在*号的左边:地址是常量不可变,值可以改变;
AC3E8B779C0890C9077FCBC6DF7D3EC6.png
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;

相关文章

网友评论

    本文标题:static、const和extern分析总结

    本文链接:https://www.haomeiwen.com/subject/pmwidctx.html