java修饰符const_修饰符static extern const的注意点

static

1>修饰全局变量

*全局变量的作用域仅限于当前文件内部,防止重命名,其他文件无法访问

2>修饰局部变量

***局部变量的生命周期,与全局变量类似

*但是不能改变作用域

*能保证局部变量永远只初始化一次

- (void)vieDidLoad{

for (int i = 0; i 

[self test];

}

}

- (void)test{

static int a = 1;

a++;

NSLog(@"%d",a);

}

//NSLog结果为 2,3,4,5,6

- (void)test1{

int a = 1;

a++;

NSLog(@"%d",a);

}

//NSLog结果为 2,2,2,2,2  因为每次调用test1,a都重新初始化

3>static在c语言中

static在c里面可以用来修饰变量,也可以用来修饰函数。

先看用来修饰变量的时候。变量在c里面可分为存在全局数据区、栈和堆里。其

int a ;

int main()

{

int b ;

int c* = (int *)malloc(sizeof(int));

}

a是全局变量,b是栈变量,c是堆变量。

static对全局变量的修饰,可以认为是限制了只能是本文件引用此变量。有的程序是由好多.c文件构成。彼此可以互相引用变量,但加入static修饰之后,只能被本文件中函数引用此变量。

static对栈变量的修饰,可以认为栈变量的生命周期延长到程序执行结束时。一般来说,栈变量的生命周期由OS管理,在退栈的过程中,栈变量的生命也就结束了。但加入static修饰之后,变量已经不再存储在栈中,而是和全局变量一起存储。同时,离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用, 而且保存了前次被调用后留下的值。

static对函数的修饰与对全局变量的修饰相似,只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用。

extern

1,访问其他文件的全局变量

*但不能访问前缀有static的全局变量

2,可让属性被其他文件引用

extern NSString *const age = @"12";

const

1.修饰变量

基础用法:  const int num = 40; 限定num不可变

其他用法:含有指针

int * const p3 = &age;   //这种写法可以归类为const在指针之后

//修改p3指针指向的内存地址(原本指向age的内存地址,现在指向常量40的内存地址)

*p3 = 40;

/* ==========错误写法============

p3 = 30;

因为const在*之后,所以它是修饰变量,变量不可变

*/

2.修饰指针

int age = 20;

const int *p1 = &age;    //这两种写法都是一样,可以归类为const在指针之前

int const *p2 = &age;    //不能通过指针间接修改变量的值

int num = 30;

//简单的变量赋值

p1 = #

p2 = #

/* ==========错误写法============

*p1 = 40;

*p2 = 40;

因为const在*之前,所以它是修饰指针,指针不可变

*/

3.注意事项

1.const和define的值都是不可变。

2.使用宏和const的好处是减少临时内存。

例如需要打印输出2个20的操作,这个时候就有2份临时内存。而打印2个define的,却只会有1份

3.define宏是编译前就处理,而const是用到那个变量才编译。

4.const只能修饰常量,字面量的值,不能含有方法。而宏就可以修饰函数方法

5.当某个文件定义了全局变量的时候int *const Appkey = 20; 其他m文件不能再次定义相同的全局变量,否则会出现链接错误。所以只能使用引用extern访问外部全局变量extern int *const Appkey;但如此的话太过麻烦。因为某个文件时候就要写重复代码extern引用.

解决办法:

新建一个cocoa class.在.m文件中 只保留#import (因为用到NSString等这些需要用到这个框架)和const语句.在h文件中,也是只保留#import 和extern语句,如此其他类需要用到的时候,只需要引用该.h文件即可,和不需要import任何.h,包括自己的.

例子:在const.h中:

#import 

extern NSString * const HWAppKey;

在const.m中:

#import 

NSString * const HWAppKey = @"3235932662";

6.我们应该多使用const,少使用宏,因为苹果官方都大量使用了const来代替define

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值