美文网首页
第4条:多用类型常量,少用#define预处理指令

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

作者: MrSYLong | 来源:发表于2018-07-30 23:45 被阅读13次
    // 在头文件中,定义常量 如下
    #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的符号。
    

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/sloqvftx.html