在过去开发中,几乎每一个人都会定义宏,因为这东西实在是好用,省去了代码量而且还不容易错,而我这篇文中所介绍的const可以完美替带宏定义. 并且苹果也建议大家抛弃宏定义而转投const ,并且swift里压根就没有宏定义这么一说,所以为了方便我们以后的开发,还是尽早弃暗投明的好 .
进入正题我们先来说说,
一. const与宏的区别:
(1)执行时刻:宏是预编译(编译之前处理),const是编译阶段。
(2)编译检查:宏不做检查,不会报编译错误,只是替换,const会编译检查,会报编译错误。
(3)宏能定义一些函数,方法。 const不能。
(这里需要证实一点,宏不会开辟新的内存空间 ,而是存放在常量区 ).
二.const作用:限制类型
(1).const仅仅用来修饰右边的变量(基本数据变量p,指针变量*p)
(2).被const修饰的变量是只读的。
三.const的具体用法
const:修饰基本变量p
// 这两种写法是一样的,const只修饰右边的基本变量b
const int b = ; // b:只读变量
int const b = ; // b:只读变量
// 不允许修改值
需要注意下面两句的区别
int const *p1; // *p1:常量 p1:变量
// const修饰指针变量p1
int * const p1; // *p1:变量 p1:常量
从上面看来,const的定义区间就一目了然了 ,只要看它后面跟的是不是指针,则指针的指向就是不可改变的, 如果后面是变量则变量的值不可修改.
四.static与const联合使用
static与const作用:
(1)声明一个只读的静态变量
那么为什么要改变全局变量作用域,主要是为了防止重复声明全局变量。 在开发中声明的全局变量,有些不希望外界改动,只允许读取。这时就需要两者一起使用.
(2) 声明一个静态的全局只读常量
比如一个基本数据类型不希望别人改动 // static const int a = 10;
(3)也可以用来代替宏,把一个经常使用的字符串常量,定义成静态全局只读变量.
(4)开发中经常拿到key修改值,因此用const修饰key,表示key只读,不允许修改。
static NSString * const key = @"name"; 注意如果 const修饰 *key1,表示*key1只读,key1还是能改变。
static NSString const *key1 = @"name";
五.extern与const联合使用
开发中使用场景:在`多个文件中`经常使用的同一个字符串常量,可以使用extern与const组合。
原因:
(1) static与const组合:在每个文件都需要定义一份静态全局变量。
(2) extern与const组合:只需要定义一份全局变量,多个文件共享。
开发中便于管理所有的全局变量,通常搞一个文件,里面专门定义全局变量,统一管理,要不然项目文件那么多,大家很容易定义冲突。