基础

const与宏定义、static和extern的使用总结

2018-04-02  本文已影响42人  54番茄

常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量,使用宏定义过多的话,随着工程越来越大,编译速度会越来越慢。

define宏与const使用场景:

define宏定义和const常变量区别:

  1. 编译器处理方式不同
      define:宏是在预编译阶段展开。
      const:常量是编译运行阶段使用。

(2) 类型和安全检查不同
  define:宏没有类型,不做任何类型检查,不会报编译错误,只是替换。
  const :常量有具体的类型,在编译阶段会执行类型检查,会报编译错误。

(3) 存储方式不同
  define:宏仅仅是展开,有多少地方使用,就替换多少次,不会分配内存。
  const:常量会在内存中分配(可以是堆中也可以是栈中)。

程序在预处理阶段将用define定义的内容进行了替换,因此程序运行时,常量表中并没有用define定义的常量,系统不为它分配内存。const定义的常量,在程序运行时在常量表中,系统为它分配内存。

const常变量:

1、const仅仅用来修饰右边的变量(基本数据变量p,指针变量*p)
2、被const修饰的变量是只读的。
3、const作用:限制类型

 const int *p1;                   // *p1:常量 p1:变量
 int const *p2;                   // *p2:常量 p2:变量
  // const修饰指针变量p1
 int * const p3;                 // *p3:变量 p3:常量
 // 第一个const修饰*p1 第二个const修饰 p1
 // 两种方式一样
 const int * const p4;         // *p4:常量 p4:常量 
 int const * const p5;        // *p5:常量 p5:常量

变量:共享一块内存空间,就算项目中N处用到,也不会分配N块内存空间,可以被修改,在编译阶段会执行类型检查
常量:共享一块内存空间,就算项目中N处用到,也不会分配N块内存空间,可以根据const修饰的位置设定能否修改,在编译阶段会执行类型检查

补充说明:以上的类型常量替换宏的情况,只是适用于单个文件的情况。如果是多个文件共享的常量,苹果推荐的这样的方式

UserInfoModel.h
extern NSString *const USER_NAME_KEY;

UserInfoModel.m
NSString *const USER_NAME_KEY    =    @"XXXXX.userName";

static作用

修饰局部变量:
1.延长局部变量的生命周期,程序结束才会销毁。
2.局部变量只会生成一份内存,只会初始化一次。
修饰全局变量
1.只能在本文件中访问,修改全局变量的作用域,生命周期不会改。
2.避免重复定义全局变量
修饰局部变量

for (int i=0; i<10; i++) {
    int a = 0;
    a++;
    NSLog(@"%d",a);
}
//输出结果为 :每次进入大括号内都会重新初始化 a 所以结果为 1。

加上static修饰

for (int i=0; i<10; i++) {
   static int a = 0;
    a++;
    NSLog(@"%d",a);
}
//输出结果为:1 ~ 10;
原因:static修饰的变量,程序一运行就会分配一次内存,用static修饰的代码,
      只会在程序一启动就会执行,以后就不会在执行,所以结果为1、2、3、...、9、10。

extern作用

声明一个变量,不能定义变量
注意:extern修饰的变量不能初始化,使用场景,一般用于声明全局变量。

static、extern与const联合使用

很多时候我们在开发中都要static和extern与const联合使用,在来看看static和extern

static  NSString * const key = @"name";

iOS中staic和const常用使用场景,是用来代替宏,把一个经常使用的字符串常量,定义成静态全局只读变量。

补充说明:开发中便于管理所有的全局变量,通常搞一个全局的文件,里面专门定义全局变量,统一管理,要不然项目文件多不好找。

上一篇 下一篇

猜你喜欢

热点阅读