第4条:多用类型常量,少用#define预处理指令

2018-07-30  本文已影响13人  MrSYLong
// 在头文件中,定义常量 如下
#define ANIMATION_DURATION 0.3

上面的预处理指令:
1、会把源代码中的ANIMATION_DURATION字符串都替换为0.3。
2、没有类型信息。
3、因为是在头文件中声明,那所有引入这个头文件的代码,其中ANIMATION_DURATION字符串都替换为0.3。
4、预处理指令所定义的常量,可以被修改,从而导致程序各个部分所使用的值互不相同。

为解决上面的问题,可以设法利用编译器的特性。
常量命名法:
1、常量局限于某“编译单元”(也就是实现文件)之内,则在前面加字母k。
2、常量在类之外可见,通常以类名为前缀。

若不打算公开某个常量,则应该将其定义在使用该常量的实现文件里。

// 上面定义的常量 应该在实现文件定义 如下
static const NSTimeInterval kAnimationDuration = 0.3;

说明:
一定要static和const同时来声明变量。
const修饰的变量不能被修改,否则编译器报错。
static修饰的变量仅在定义此变量的编译单元中可见,也就是作用域仅限于该常量实现文件所生成的目标文件中。
(编译器每收到一个编译单元,就会输出一份“目标文件”,OC下,“编译单元”通常指每个类的实现文件)

上面代码会像使用预处理指令一样,把所有遇到的变量都替换为常量,但用这种方法定义常量带有类型信息。

若要公开某个常量,则此类常量需放在“全局”符号表中,以便可以在定义该常量的编译单元之外使用。注意命名应用类名作为前缀。

// 头文件
extern NSString *const EOCStringConstant;

// 实现文件
NSString *const EOCStringConstant = @"Value";

说明:
常量在头文件中“声明”,在实现文件中“定义”,且必须要定义,只能定义一次。
该常量定义应从右至左解读,“一个常量,而这个常量是指针,指向NSString 对象”。
extern关键字告诉编译器,在全局符号表中将会有一个叫EOCStringConstant的符号。
上一篇下一篇

猜你喜欢

热点阅读