编写高质量代码的52个有效方法

52个有效方法(4) - 多用类型常量,少用#define预处理

2018-08-08  本文已影响16人  SkyMing一C

局部常量

在实现文件中使用 static const 来定义“只在编译单元内可见的常量”(translation-unit-specific constant)。其命名规则为在前面加字母k

//  
//  EOCAnimatedView.h  
//  
  
#import <UIKit/UIKit.h>  
  
@interface EOCAnimatedView : UIView  
  
@end  
  
//  
//  EOCAnimatedView.m  
//  
  
#import "EOCAnimatedView.h"  
  
static const NSTimeInterval kAnimataionDuataion = 0.5;  
@implementation EOCAnimatedView  
  
@end  

全局常量

在头文件中使用extern const 来声明全局常量,并在相关实现文件中定义其值。其命名规则为以类名为前缀。

//  
//  EOCAnimatedView.h  
//  
  
#import <UIKit/UIKit.h>  

extern NSString *const EOCAnimatedViewStringConstant;
extern const NSTimeInterval EOCAnimatedViewDuration;

@interface EOCAnimatedView : UIView  
  
@end  
  
//  
//  EOCAnimatedView.m  
//  
  
#import "EOCAnimatedView.h"  
  
NSString *const EOCAnimatedViewStringConstant = @"VALUE";
const NSTimeInterval EOCAnimatedViewDuration = 3.3;

@implementation EOCAnimatedView  
  
@end  
/**
这个常量在头文件中"声明",且在实现文件中"定义".注意const修饰符的位置,常量定义应该从右至左解读,所以在示例中, EOCAnimatedViewStringConstant就是"一个常量, 而这个常量是指针, 指向NSString对象".这与需求是相符的,因为我们不希望有人改变此指针常量.使其指向另外一个NSString对象.

还要说一点就是因为符号要放在全局符号表中,所以一定要注意常量的命名规范.避免名称冲突,最好使用与之相关的类名做前缀.系统框架中一般都是这么做的.
*/
要点:
  1. 不要用预处理指令定义常量。这样定义出来的常量不含类型信息,编译器只会在编译前据此执行查找与替换操作。即使有人重新定义了常量值,编译器也不会产生警告信息,这将导致应用程序中的常量值不一致。

  2. 在实现文件中使用static const 来定义“只在编译单元内可见的常量”(translation-unit-specific constant)。一个编译单元就是一个.m文件。由于此常量不在全局符号表中,所以无需为其名称加前缀(在其前面加字母k)

  3. 在头文件中使用extern const来声明全局常量,并在相关实现文件中定义其值。这种常量要出现在全局符号表中,所以其名称应加以区分,通常用与之相关的类名做前缀。

上一篇 下一篇

猜你喜欢

热点阅读