关于const,extern,static

作者: 齐滇大圣 | 来源:发表于2015-07-11 01:30 被阅读193次

    创建常量的问题###

    oc中有一些方法是创建常量的,但是具体用哪一种好呢?

    • #define macro
    • const(const int a = 1 跟 int const a=1 一样都是修饰的a不可变)
    • static const
    • extern const
    • enum (只可以定义integer类型的常量)

    const
    在标准C中const定义的变量是外连接的,即如果一个编译单元中定义了一个全局const常量,则其在其他编译单元中是可见的,如果其他编译单元也定义了同名const常量就会产生重复定义错误。

    比如在 constViewController.m 文件中定义了 const int SONSTTEST = 1;
    然后在 ViewController.m中也定义了const int SONSTTEST = 1;而ViewController.m并未引入constViewController.m,编译器也会报错。

    const int SONSTTEST = 1;改为static const int SONSTTEST = 1;就是把const常量标记为对外不可见

    /----------指针常量----------/
    NSString * const ptr1 = @"AB";
    ptr1 = @"A"; //错误,指针不可变,所以ptr1不可变

    /----------常量指针---------/
    const NSString *ptr1 = @"AB"; (从右往左读,const修饰的是 *ptr1)
    ptr1 = @"A"; //正确,*ptr1不可变,ptr1可变


    extern
    全局的变量

    假如其他a类中已经声明了meString,你在另外一个b类中想使用这个变量,可以extern NSString* meString;会得到a类中同样的值.


    个人觉得如果使用局部的常量可以在.m中用
    static const int a = 1

    如果使用全局的常量的话可以使用
    extern const, 比如在a类中声明了 meString,在b中引入a.h就可以直接使用meString。 如果没引入的话在b中extern NSString* meString;也能得到a类中同样的值。 所以比较适合属于某一个类中的全局常量,其他类可以直接使用。

    如果使用属于整个application的全局常量的话就可以使用
    #define macro


    github 测试demo

    相关文章

      网友评论

        本文标题:关于const,extern,static

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