美文网首页
变量修饰符-宏/static/const/extern的差别

变量修饰符-宏/static/const/extern的差别

作者: 奚山遇白 | 来源:发表于2018-07-04 20:24 被阅读0次

宏#define

1.预编译时期编译(每次打开项目期间,都会自动读条,这个是预编译),无编译检测
2.不仅可以定义变量,还可以定义函数
3.大量使用宏, 并不会导致内存暴增。因为只分配一份内存地址
4.如果一个宏的定义是一串很长的代码,而且这个宏被多次使用,那么编译后将会使用该宏的定义替换掉那些使用宏的地方,所以就会出现很多重复的代码,这是很低效的,另外大量使用宏,可能会导致预编译时间过长,不方便马上调试。

static

1.被static修饰的静态变量在运行的时候系统会在栈上为其分配固定地址存放,一直到程序结束才会被销毁,所以在整个程序运行期间都有效
2.静态变量只能存储值,而不能像宏一样定义操作
3.修饰的全局变量仅在当前文件有效,所以保证即使不同文件定义了同名变量也不会相互干扰

const

1.编译时期编译,有编译检测
2.需注意const修饰右边的变量,被const修饰的变量只读,所以在实际使用中需要注意const修饰的变量

int * const a; // a:只读 *a:变量
const int *a1; // *a1:只读 a1:变量
int const *a2; // *a2:只读 a2:变量
int const * const a3; // *a3:只读 a3:只读
const int  * const a4; // *a4:只读 a4:只读

3.swift中, 苹果已经将宏废除, 所以在swift项目开发中须用const代替宏
4.一般与static联合使用

// 修饰kAppID变量只读,并且只能在当前文件下使用
static NSString* const kAppID = @"yourAppID";

extern

1.需注意:extern仅能用来声明全局变量,而不能用来不能定义变量
2.一般与const联合使用

在项目开发中,如果全局常量很多,一般会新建一个来管理,例如:

//  GlobalConsts.h
// 服务器地址
UIKIT_EXTERN NSString *const kNetWorkServiceAddress;

// 用户中心请求路径
UIKIT_EXTERN NSString *const kUserInfoPath;


//  GlobalConsts.m
NSString *const kNetWorkServiceAddress = @"https://www.baidu.com";

NSString *const kUserInfoPath = @"/userInfo/";

tip

【Q】为什么不将上述例子中的全局常量放进.pch中?
【A】因为苹果不建议使用pch,pch的原理是将其中定义的宏或全局常量/变量等copy到每个执行文件(.m文件), 1.冗余 2.如果在其中定义全局常量, 则会报重复定义全局常量错误.

相关文章

网友评论

      本文标题:变量修饰符-宏/static/const/extern的差别

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