iOS进阶之路

IOS:static和extern的使用

2019-01-18  本文已影响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;

上一篇下一篇

猜你喜欢

热点阅读