关于extern、static、const的使用

extern:

  • 只是用来获取全局变量(包括全局静态变量)的值,不能用于定义变量
  • 先在当前文件查找有没有全局变量,没有找到,才会去其他文件查找。

如果在A.m中定义一个变量如下:

#import "A.h"
NSString *PropertyTypeInt = @"i";
NSString *PropertyTypeFloat = @"f";

而在另外一个类实现B.m中需要使用PropertyTypeIntPropertyTypeFloat,只需在B.m中这样实现:

#import "B.h"
extern NSString* PropertyTypeInt;
extern NSString* PropertyTypeFloat;

这时你会发现打印PropertyTypeIntPropertyTypeFloat,是if

static:

1.两个.m文件中同样的全局变量:


关于extern、static、const的使用_第1张图片
vc.m中定义

关于extern、static、const的使用_第2张图片
person.m中定义
关于extern、static、const的使用_第3张图片
报错提示,出现相同变量名

同一个工程中,两个不同 .m 文件中同样的全局变量不能同时存在

2.静态全局变量 :


关于extern、static、const的使用_第4张图片
在person.m中用static修饰agee
关于extern、static、const的使用_第5张图片
在ViewController中使用agee报错

因为在Person中agee是一个静态全局变量,尽管在ViewController使用了关键字extern想使用它,但还是不行的,静态全局变量只能在本文件中使用,不允许其他文件的调用!

const:

  1. const一般用来定义一个常量, 既然叫做常量, 即以后再也不能修改其值.
    2.const仅仅用来修饰右边的变量(基本数据变量p,指针变量*p)

static与const联合使用

  • static与const作用:声明一个只读的静态变量;
  • 开发使用场景:在一个文件中经常使用的字符串常量,可以使用static与const组合
// 声明一个静态的全局只读常量
static const int a = 20;

// staic和const联合的作用:声明一个静态的全局只读常量

// 开发中经常拿到key修改值,因此用const修饰key,表示key只读,不允许修改。
static  NSString * const key = @"name";

// 如果 const修饰 *key1,表示*key1只读,key1还是能改变。

static  NSString const *key1 = @"name";

extern与const联合使用

  • 开发中使用场景:在多个文件中经常使用的同一个字符串常量,可以使用extern与const组合。
  • 原因:
    static与const组合:在每个文件都需要定义一份静态全局变量。
    extern与const组合:只需要定义一份全局变量,多个文件共享。
  • 全局常量正规写法:开发中便于管理所有的全局变量,通常搞一个GlobeConst文件,里面专门定义全局变量,统一管理,要不然项目文件多不好找。

参考文章

那些人追的干货

你可能感兴趣的:(关于extern、static、const的使用)