美文网首页
const、define、static、extern

const、define、static、extern

作者: aven_kang | 来源:发表于2022-06-08 22:31 被阅读0次
    1.extern

    extern用于变量的声明,告诉编译器:已经存在一个全局变量,但是不在当前的编译单元内,需要连接的时候在其他编译单元中寻找。

    2.static

    修改变量作用域为当前编译单元,变量生命周期不变;
    避免重复定义全局变量
    2.2. 修饰局部变量 -
    修改变量的生命周期为整个工程周期,变量作用域不变

    3.const

    const修饰右边的变量,用来限制变量为只读属性。

    4.define

    在程序的预编译阶段进行替换处理。

    5. define与const

    区别:
    1.define宏是在预处理阶段展开。
    const常量是编译运行阶段使用。
    2.define不做检查,不会报编译错误,只是替换。const会编译检查,会报编译错误
    3.define在展开的时候才分配内存,展开几次分配几次内存。const在定义的时候会分配一次内存到静态区,使用时不重复分配
    4.define可以定义一些简单的运算函数

    6. static和const的联合使用

    声明一个只读的静态变量

    7. extern和const的联合使用

    在多个文件中经常使用的同一个全局变量。
    使用场景:
    1、.h文件中声明

    image

    2、.m文件中赋值

    image

    3、pch文件中导入头文件即可在整个项目中访问

    在swift想实现一样的功能非常简单,只需要新建一个swift文件,定义常量即可。
    image

    这里直接访问即可,都不用放到.pch文件中,因为默认权限是internal
    public : 最大权限,可以在当前framework和其他framwork中访问;
    internal : 默认权限,可以在当前framework中随意访问;
    private : 私有权限,只能在当前文件中访问;

    image
    8、用第7条代替define

    一般常量的话,都用extern const 来代替define。
    因为一旦定义#define的方式,整个工程将被重新编译,这样带来的时间浪费可想而知
    当然了很多情况还是代替不了的,一般定义常量的时候是应该使用这种方式来定义,不过也只是常量宏不被推荐,但是类函数宏用的还是很方便的,
    const、#define的优缺点
    编译器可以对const进行类型安全检查。而对#define只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。

    这种情况还可能出现以下错误
    Sending 'const NSString *__strong' to parameter of type 'NSString *' discards qualifiers
    原因是需要NSString* 的地方使用了const NSString*

    解决办法就是

    .h中 extern const NSString* 替换为extern NSString* const
    .m中const NSString* 替换为 NSString* const
    解释:前者相当于指针本身不可修改,后者表示指针指向的内容不可修改,两者的作用都是使字符串只可读不可写。

    相关文章

      网友评论

          本文标题:const、define、static、extern

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