define, const与extern

define
一个宏定义由三部分组成 , 三分部之间用空格分开, 宏除了可以定义常量,还可以定义函数(const只能定义常量)。
宏定义, 实质是文本替换, 是在预编译阶段的功能. 预处理是在编译之前的处理,而编译工作的任务之一就是语法检查,预处理不做语法检查。
宏定义不分配内存,const变量定义分配内存(指针)。
宏定义不存在类型问题,它的参数也是无类型的。
宏定义大量使用,容易造成编译时间久,每次都需要重新替换。

const
const,当用于修饰变量时,则指定了变量值是不变的。

const变量与define宏定义的区别
(1) 编译器处理方式不同
define宏是在预处理阶段展开。
const变量在编译时确定其值。
(2) 类型和安全检查不同
define宏没有类型,不做任何类型检查,仅仅是展开。
const变量有具体的类型,在编译阶段会执行类型检查。
(3) 存储方式不同
define宏仅仅是展开,有多少地方使用,就展开多少次,宏本身不会分配内存,宏展开后的立即数是会占用内存的。(展开多少次就分配多少次内存)
编译器通常不为普通const变量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,编译时对其进行类似于宏定义的操作,在出现const变量的地方就替换成其对应的值,没有了存储与读内存的操作,使得它的效率也很高。只有在对const变量使用extern关键字或者取地址操作时才会为它分配存储空间,且const变量从汇编的角度来看,操作const变量时只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const变量在程序运行过程中只有一份拷贝,不会多次分配存储空间。


1. 简单的例子:

//定义变量
int const age = 100;
const float height = 200;

//若修改变量的值
age = 101;//编译报错
height = 201;//编译报错


2. 使用extern定义项目的全局常变量

.h文件
/*
项目的全局变量
*/
@interface MenuOrderExtern : NSObject

//下面定义的指针,“值”(内容)是可以改变的,因为const此时修饰的是指针p,而不是指针内容。
//UIKIT_EXTERN NSString const *orderTypeBreakfast;
//UIKIT_EXTERN const NSString *orderTypeBreakfast;


//const,修饰的是它右边的内容。此时修饰的是变量本身,所以值不可被改变。
//所以,需要定义全局常变量而且防止被无意修改,下面也是苹果官方写法:
//UIKIT_EXTERN =extern,此处的作用是为了阅读代码的人知道,别处有此引用,写不写对编译器没关系
UIKIT_EXTERN NSString *const orderTypeBreakfast;
UIKIT_EXTERN NSString *const orderTypeLunch;
UIKIT_EXTERN NSString *const orderTypeDinner;

@end

扫描二维码关注公众号,回复: 1936673 查看本文章


.m文件

@implementation MenuOrderExtern
//定义实质的内容
NSString *const orderTypeBreakfast = @”breakfast”;
NSString *const orderTypeLunch = @”lunch”;
NSString *const orderTypeDinner = @”dinner”;

@end


如何使用

//外部.m文件引用
extern NSString *const orderTypeBreakfast;

猜你喜欢

转载自blog.csdn.net/james15902085063/article/details/79500368