如何正确使用const(常量),define(宏)

前言

在开发中,也许咱们会常常使用到宏定义,或者用const修饰一些数据类型,常常有开发者不知道怎么正确使用,致使项目中乱用宏定义与const修饰符。本篇主要介绍在开发中怎么正确使用constdefine(宏定义)函数

当咱们想定义全局共用的一些数据时,好比通知名字,动画时长等等,咱们能够用常量变量测试

  • 宏:优化

    // 注意后面不须要带符号
        #define ScottDidLoginSuccess @"登录成功"
  • 变量:动画

    // 注意后面必定要带符号
        NSString *scottDidLoginSuccess = @"登录成功";
  • 常量:调试

    // 四种写法
        static const NSString *scottDidLoginSuccess = @"登录成功";
        const NSString *scottDidLoginSuccess = @"登录成功";
        NSString const *scottDidLoginSuccess = @"登录成功";
        NSString *const scottDidLoginSuccess = @"登录成功";

那么问题来了,咱们到底该如何选择呢?
让我来先将一下我对它们之间的理解吧:code

  • 宏:只是在预处理阶段进行文本替换,没有类型,不作任何类型检查,编译器能够对相同的字符串进行优化,只保存一份到数据段。甚至有相同后缀的字符串也能够优化,你可使用GCC编译测试,Hello worldworld两个字符串,只存储前面一个。取的时候只须要给前面和中间的地址,若是是整型、浮点型会有多分拷贝,但这些数写在指令中,占的只是代码片断并且,大量使用宏会致使二进制文件变大。
  • 变量:共享一块内存空间,就算项目中N处用到,也不会分配N块内存空间,能够被修改,在编译阶段作类型检查。
  • 常量:共享一块内存空间,就算项目中N处用到,也不会分配N块内存空间,能够根据const修饰的位置设定可以修改,在编译阶段作类型检查。

常量区分

  • 全局常量:无论你定义在任何文件夹,外部都能访问内存

    const NSString *scottDidLoginSuccess = @"登录成功";
  • 局部常量:用static修饰后,不能供外界访问开发

    static const NSString *scottDidLoginSuccess = @"登录成功";

const修饰位置不一样,表明什么

// 1.
    const NSString *scottDidLoginSuccess = @"登录成功";
    // 2.
    NSString const *scottDidLoginSuccess = @"登录成功";
    // 3.
    NSString * const scottDidLoginSuccess = @"登录成功";

咋一看,WTF,这不都张同样嘛,其实不同,下面解释一下各表明什么字符串

  1. *scottDidLoginSuccess不能被修改,scottDidLoginSuccess能被修改
  2. *scottDidLoginSuccess不能被修改,scottDidLoginSuccess能被修改,也就是和第一种状况是同样的
  3. scottDidLoginSuccess不能被修改,*scottDidLoginSuccess能被修改。

结论:const右边的总不能被修改编译器

因此咱们通常定义一个常量又不想被修改,应该这样定义:
NSString *const scottDidLoginSuccess = @"登录成功";

二者之间的区别

  • define在预处理阶段进行替换,const常量在编译阶段使用;
  • define不作类型检查,只进行替换,const常量有数据类型,会执行类型检查;
  • define不能调试,const常量能够调试;
  • define定义的常量在替换后运行过程当中,会不断占用内存,而const定义的常量存储在数据段,只有一份拷贝,效率更高;
  • define能够定义函数,const不能够。
相关文章
相关标签/搜索