iOS之 深究extern,static的用法和作用
2016-07-22 13:18
295 查看
extern
首先看代码示例:
GDGPerson.m 文件
#import "GDGPerson.h" @implementation GDGPerson int age = 10; @end
main.m文件 ,不用包含GDGPerson类的头文件
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { extern int age; age = 30; NSLog(@" %d", age); } return 0; }
在工程中新添加一个GDGPerson的类
在GDGPerson.m里写 int a = 10;
,在main.m里写 int a ;
,NSLog(@"%d",a);
打印会报错
因为无法引用外部变量
int a;
前加上extern,就可以打印出来,a的值是10
只要你在全局变量前加extern,你的这个文件就可以访问这个全局变量
首先清楚一点,默认条件下,全局变量的是整个程序都能访问的
记住! extern int a;
是并没有分配内存的,这样写不是定义变量
怎么写是定义变量?
int a;
这样写才是定义变量。
在main.m里怎么修改a 的值才不会报错?
这样写 a = 30;
打印出来的值a 是30
所以记住
任何情况下全局变量都是不安全的!为什么? 随时可能会被别人改掉。总结:
<1>要想访问全局变量可以在前面加extern
<2>extern修饰的变量没有真正内存
static
1.修饰全局变量
GDGPerson.m文件
#import "GDGPerson.h" @implementation GDGPerson static int age = 10; @end
main.m文件 不用包含GDGPerson类的头文件
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { extern int age; NSLog(@" %d", age); } return 0; }
那么我想我定义的全局变量只允许本文件访问,其他文件不能访问,怎么办?
简单,在int a = 10;
前加static
只要在全局变量前加static,那么这个全局变量的作用域就会缩小到当前文件,外界就不能访问了。
这时请在GDGPerson.m文件 int a = 10;
前加static,再运行程序,就会发现报错了
好处:保证全局变量安全,外界不可访问与修改
总结:static修饰全局变量,全局变量的作用域仅限于当前文件
2.修饰局部变量的作用
先看代码示例:
main.m文件
void test() { static int a = 0; a++; NSLog(@"a = %d", a); } int main(int argc, const char * argv[]) { @autoreleasepool { for (int i = 0; i<3; i++) { test(); } } return 0; }
修饰局部变量时,作用域仅限于test函数的大括号,其他地方都不顶用
test这个函数中如果不加static,那么a打印出来的结果永远是1
因为每当调用一次函数,就会定义一个新的变量
每次a的值都是零,加加后就是1
但是加上static后,含义就不一样了
再打印的结果就是1,2,3
因为被static修饰的变量只会初始化一次,永远都只有一份内存
所以当第一次调用test函数时
a有一个内存空间,并且值是0
第二次再调用test函数时由于int a被 static 修饰
所以不会再初始化新值
它会拿到之前的那份内存加加,就会变为1
以此类推,之后就会变为2,3
好处:保住所修饰变量的命,保证它不会挂
总结:
<1>让局部变量只初始化一次
<2>局部变量在程序中只有一份内存
<3>并不会改变局部变量的作用域,仅仅是改变了局部变量的生命周期(只到程序结束,这个局部变量才会销毁)
相关文章推荐
- Python动态类型的学习---引用的理解
- 理解C#编程中的静态类和静态成员以及密封类
- Lua中的全局变量、非全局变量总结
- Shell脚本中引用、调用另一个脚本文件的2种方法
- vbs引用另一个vbs的代码
- js DOM 元素ID就是全局变量
- C++中引用的使用总结
- C++中引用(&)的用法与应用实例分析
- c语言全局变量和局部变量问题及解决汇总
- 深入探讨C语言中局部变量与全局变量在内存中的存放位置
- 关于"引用"的几点说明介绍
- 深入uCOS中全局变量的使用详解
- C++中的extern “C”用法详解
- C++中extern "C"的用法
- C语言中static的作用及C语言中使用静态函数有何好处
- Ruby 中$开头的全局变量、内部变量、隐藏变量介绍
- sqlserver 局部变量的使用
- 从汇编看c++中函数里面的static关键字的使用说明
- c++运算符返回值问题
- python django - static文件处理与线上部署测试