zoukankan      html  css  js  c++  java
  • 多用类型常量,少用#define预处理指令

    摒弃:
    #define ANIMATION_DURATION 0.3
     
    #define ERROR_MESSAGE @“ErrorMessage”
    1)没有常量的类型信息
    2)假设此指令声明在某个头文件中,那么所有引入了这个头文件的代码,都可以访问和修改ANIMATION_DURATION。
     
    推荐:
    1、私有常量
    .m文件
    static const NSTimeInterval kAnimationDuration = 0.3;
     
    static NSString *const kErrorMessage = @“ErrorMessage”;
     
    2、公开常量
    .h文件
    extern const NSTimeInterval PersonModelAnimationDuration;
     
    extern NSString *const PersonModelErrorMessage;
     
    .m文件
    const NSTimeInterval PersonModelAnimationDuration = 0.3;
     
    NSString *const PersonModelErrorMessage = @“ErrorMessage”;
     
    几点说明:
    1、常量名称的常用命名方法:若常量局限于某“编译单元”,也就是“实现文件”之内,则在前面加字母k;若常量在类之外可见,则通常以类名为前缀。
     
    2、在头文件里声明预处理指令来定义常量,这样做真的非常糟糕,当常量名称有可能互相冲突时更是如此。
     
    3、私有变量一定要同时使用static与const来声明。如果试图修改由const修饰符所声明的变量,那么编译器就会报错。而static修饰符则意味着该变量仅在定义此变量的编译单元中可见。编译器每收到一个编译单元,就会输出一份“目标文件(object file)”在Objective-C的语境下,“编译单元”一词通常指每个类的实现文件(以.m为后缀名)。因此,在上述范例代码中声明的kAnimationDuration变量,其作用域仅限于由PersonModel.m锁生成的目标文件中。假如声明此变量时不加static,则编译器会为它创建一个“外部符号”。此时,若是另一个编译单元中也声明了同名变量,那么编译器就会抛出一条错误消息。
     
    4、事实上,如果一个变量既声明为static,又声明为const,那么编译器根本不会创建符号,而是会像#define预处理指令一样,吧所有遇到的变量都替换为常量。不过,区别是,用这种方法定义的常量是带有类型信息的。
     
    5、全局常量需要放在“全局符号表”中,以便可以在定义该常量的编译单元之外还用。因此全局常量是会创建符号的。
     
    6、extern这个关键字是要告诉编译器,在全局符号表中将会有一个名为***的符号。也就是说,编译器无须查看其定义,即允许代码使用此常量。因为它知道,当链接成二进制文件之后,肯定能够找到这个常量。因此,此类常量必须定义,而且只能定义一次。通常将其定义在与声明该常量的头文件相关的实现文件里。
     
  • 相关阅读:
    Java中HashMap底层实现原理(JDK1.8)源码分析
    java io系列01之 "目录"
    数据结构与算法系列 目录
    Java 集合系列目录(Category)
    ls参数
    在PATH路径中添加新的路径
    目录相关的操作
    chmod
    属性类型
    ls -al
  • 原文地址:https://www.cnblogs.com/cchHers/p/6931177.html
Copyright © 2011-2022 走看看