美文网首页iOS进阶之路
IOS:static和extern的使用

IOS:static和extern的使用

作者: 康小曹 | 来源:发表于2019-01-18 11:33 被阅读193次

    先上代码:

    static int var1 = 10;
    void staticTest(void);
    void countMethod(void);
    
    int main() {
        @autoreleasepool {
            staticTest();
        }
    }
    
    void staticTest(void) {
        countMethod();
        countMethod();
        
        extern int var1;
        printf("%d\n",var1);
        printf("%p\n",&var1);
    }
    
    void countMethod(void) {
        static int var1 = 0;
        var1++;
        printf("%d\n",var1);
        printf("%p\n",&var1);
    }
    

    输出结果:

    1
    0x102dce3c0
    2
    0x102dce3c0
    10
    0x102dce190
    

    一、extern的作用

    extern:引入全局变量,本文件中没有就从整个项目中引入,如果整个程序中都不存在,编译阶段将会报错。
    重点:引入的是全局变量,而不是全局区的变量。全局区包括全局变量和静态变量。
    例子:
    代码中注释掉本段:

    //static int var1 = 10;
    

    运行以上代码将会报错:


    extern

    原因:
    extern引入的是全局变量,而不是全局区的局部静态变量。

    二、static修饰局部变量

    static修饰局部变量的几个功能:
    1.改变局部变量的生命周期,将局部变量从栈中存储到全局区,生命周期从函数/代码块执行完成后销毁延长到了:程序的开始到结束
    2.不改变局部变量的作用域。
    例子:
    运行以上代码,前两次打印:

    1
    0x102dce3c0
    2
    0x102dce3c0
    

    原因:
    var1没有被销毁,存在整个程序的生命周期中。

    三、static修饰全局变量

    static修饰全局变量的几个功能:
    1.不改变声明周期,全局变量的生命周期仍然是整个程序开始到结束;
    2.改变了全局变量的作用域,由项目中任意文件都可以使用缩减成了只有在本文件中可以使用;
    例子:
    运行以上代码,最后一次打印:

    10
    0x102dce190
    

    原因:
    1.证明了两个var1虽然都是存储在全局区,但是却不是同一块内存,也就是说不是同一个变量;
    2.extern引入的是全局变量,所以最后会打印10;

    相关文章

      网友评论

        本文标题:IOS:static和extern的使用

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