宏(define)与常量(const)

参考文档

  • iOS 宏(define)与常量(const)的正确使用
  • 15分钟弄懂 const 和 #define

注:配合我的文档《static、const、extern简介与使用》一起看更佳!!!


Part 1 - 理解部分


一、什么是const ?

const是C/C++中的一个关键字(修饰符), const一般用来定义一个常量, 既然叫做常量, 即以后再也不能修改其值.

宏(define)与常量(const)_第1张图片
const定义常量

二、什么是#define?

define, 宏定义, 则是一条预编译指令, 编译器在编译阶段会将所有使用到宏的地方简单地进行替换. 如下图所示 :

宏(define)与常量(const)_第2张图片
宏定义的替换

三、他们有什么用?

  • const 和 define 都能定义一个常量, 都能实现修改值修改一次, 则所有用上该常量的地方都同步改值, 一句代码都不用改.

  • 使代码更易维护

  • 提高代码的效率

四、他们有什么区别?

  • 相同点

    • 都能定义常量
  • 不同点

    • const有修饰功能 :除了定义常量外,const 还有强大的修饰功能。#define 能增加程序的可读性,有些复杂的功能只需一条宏显示。
    • 类型检查:const 对数据进行类型检查。#define 无需进行类型检查。定义宏参数时需将参数()起来。而且调用时参数不应在宏中再做运算。
    • 内存消耗:const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝,所以宏在程序运行过程中所消耗的内存要比const变量的大得多。
      宏(define)与常量(const)_第3张图片
      分配内存
    • 编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率比宏定义要高
  • 宏能做到const不能办到的事.

    • 宏能定义函数
    • OC的单例模式用到宏
    • 宏还能根据传入的参数生成字符串, 如下


      宏(define)与常量(const)_第4张图片
      image

Part 2 - 实战部分


五、define与const使用

你能区分下面的吗?知道什么时候用吗?

#define HSCoder @"AAAAAA"
NSString *HSCoder = @"AAAAAA";
extern NSString *HSCoder;
extern const NSString *HSCoder;

static const NSString *HSCoder = @"AAAAAA";

const NSString *HSCoder = @"AAAAAA";
NSString const *HSCoder = @"AAAAAA";
NSString * const HSCoder = @"AAAAAA";

宏:

#define HSCoder @"AAAAAA"

变量:

NSString *HSCoder = @"AAAAAA";

常量:

四种写法:

static const NSString *HSCoder = @"AAAAAA";
const NSString *HSCoder = @"AAAAAA";
NSString const *HSCoder = @"AAAAAA";
NSString * const HSCoder = @"AAAAAA";

常量区分

  • 全局常量:不管你定义在任何文件夹,外部都能访问
const NSString *HSCoder = @"AAAAAA";
  • 局部常量:用static修饰后,不能提供外界访问
static const NSString *HSCoder = @"AAAAAA";

const修饰位置不同,代表什么?

1.const NSString *HSCoder = @"AAAAAA";
"*HSCoder"不能被修改, "HSCoder"能被修改
2.NSString const *HSCoder = @"AAAAAA";
"*HSCoder"不能被修改, "HSCoder"能被修改
3.NSString * const HSCoder = @"AAAAAA";
"HSCoder"不能被修改,"*HSCoder"能被修改
注意:1和2其实没什么区别
结论:const右边的总不能被修改
所以一般我们定义一个常量又不想被修改应该这样:
NSString * const HSCoder = @"AAAAAA";

我的使用

宏(define)与常量(const)_第5张图片
h文件
宏(define)与常量(const)_第6张图片
m文件

你可能感兴趣的:(宏(define)与常量(const))