多用类型常量, 少用 #define 预处理指令
#define 预处理指令会把碰到的所有 指定名称 一律换位 定义的内容, 这样的话, 假设此指令在某个头文件中, 那么所有引入这个头文件的代码, 都会被替换
解决这个问题, 有一个办法
static const NSString * name = @"name";
请注意,用此方式定义的常量包含类型信息, 器好处是清除地描述了常量的含义,
还要注意常量名称, 常量命名的方法是: 若常量局限于 "编译单元", 也就是实现文件, 即 .m 文件里面, 则在前面加字幕 k. 若常量在类之外可见, 则通常以类名为前缀
定义常量的位置很重要, 我们总习惯在头文件里声明 预处理指令, 这样所有引入这份头文件的其他文件都会出现这个 预处理指令, 就是用static const 定义的常量也不应该出现在头文件中,
正确的做法是, 若不打算公开某个常量, 则应该将其定义在使用该常量的实现文件里面, 在 @implemantation xxxxxxxx 上方写.
而用 static 修饰符则意味着该白能量仅在定义变量的编译单元中可见, 加入声明次变量时不加 static ,此时若是另一个编译单元中也声明了 同名变量, 编辑器就会报错
有时候需要对外公开某个常量, 应该这样来定义
在 头文件中,即 .h 文件
extern NSString*const XXXXXX;
在 实现文件中, 即 .m 文件
NSString *const XXXXXX = @"xxxxxx";
这个常量在头文件中 声明, 且在实现文件中定义,
//这样定义常量要由于使用 #define 预处理指令, 因为编译器会确保常量值不变,
总结 :
不要用预处理指令定义吃那个两, 这样定义出来的常量不包含类型信息, 编译器只是在编译前据此执行查找与替换操作, 即使有人冲洗定义了常量值, 编译器也不会产生警告信息,这将导致应用程序的常量值不一致.
在实现文件中使用 static const 来定义 只在编译单元可见的常量 , 由于此类常量不在全局单元符号表中, 所以无需为其名称加前缀
在头文件中使用 extern 来声明全局变量, 并在相关实现文件中定义其值, 这种常量要出现在全局符号表中, 所以其名称应加区隔, 通常用用户只相关的类名做前缀
网友评论