美文网首页基础
const与宏定义、static和extern的使用总结

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

作者: 54番茄 | 来源:发表于2018-04-02 17:45 被阅读42次

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

define宏与const使用场景:

  • 宏在开发中使用的场景:
    1、定义常用字符串。
    2、定义一段函数,方法。

  • const在开发中使用的场景:
    1、定义全局只读参数,代替宏,减低编译速度。
    2、方法中定义只读参数,不允许更改。

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与const联合使用
    开发使用场景:在一个文件中经常使用的字符串常量,可以使用static与const组合,声明一个在本文件中静态的全局只读常量。
static  NSString * const key = @"name";

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

  • extern与const联合使用
    开发中使用场景:在多个文件中经常使用的同一个字符串常量,可以使用extern与const组合。

  • extern与static使用区分:
    1、static与const组合:在每个文件都需要定义一份静态全局变量。
    2、extern与const组合:只需要定义一份全局变量,多个文件共享。

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

相关文章

网友评论

    本文标题:const与宏定义、static和extern的使用总结

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