宏,全局变量和全局常量以及static,extern,const关键字

I 全局常量


一. 宏和全局变量的优缺点

宏的优点

  • 在程序运行中的值永远是固定的,保证了数据的安全

全局变量的优点

  • 不会产生很多临时的空间,所有用到的地方都访问的统一个变量

宏的缺点

  • 宏是直接替换的,它会产生许多个临时的存储空间来存储需要替换的部分,这样会浪费内存,没有必要

全局变量的缺点

  • 在程序运行中可能被修改

二. 全局常量 - const关键字

1. const的特点

  • 在编译阶段就要确定值是多少
  • 综合了宏和全局变量的优点
  • 被const修饰的变量会变成常量
  • const写在类型前还是类型后都一样
    • int const age = 20
    • const int age = 20
    • 因为const修饰右边,所以右边是哪个变量名字就修饰哪个变量

2. const和指针

  • const只修饰右边内容,被const修饰的内容就是常量
  • 右边是什么,就是常量
int * const p1;// p1是常量,*p1是变量
int const * p2;// *p2是常量, p2是变量
const int * p3;// *p3是常量,p3是变量
const int * const p4;//p4是常量,*p4是常量
int const * const p5;//p5是常量,*p5是常量

3. const和指针的应用

  • 以后写常量就用const粘着变量名
const int age = 20;
const int *p = &age; //int *p = &age;
*p = 30;// 因为age是常量,间接通过指针也不能修改age,是绝对安全的 
  • 注意 为了避免这种情况应该使用const int *p = &age;

三. const和宏的选用

  • const是在编译阶段就要确定值是多少
  • 需要执行某些方法的情况就不能用const,比如全局颜色定义宏
#define LNColorBg [UIColor redColor]
//需要调用UIColor这个类才能设置颜色
//而const是在编译阶段就已经确定了的,如果使用const来定义会报错

II 全局变量


  • 全局变量要写在函数,方法的外面

一.全局变量的作用域

  • 全局变量默认是全世界都能访问的

二.extern

  • 利用extern,可以引用一个全局变量,可以在任何文件中访问这个全局变量,也能够修改
  • 注意 全局变量的名字如果重复的话,会出现访问混乱,报重复定义的错误,所以全局变量的名字不能重复
补充:函数
  • 默认函数也是能全世界都能访问的
  • 只要利用extern引用一下就可以了,也不允许函数名重复

三.static,const和extern总结

1. static

  • 被static修饰的全局变量,作用域仅限于当前文件
    • 作用域改变(由全世界都能访问变为只在当前文件下才能访问)
    • 生命周期不变(整个程序运行过程中只占一份内存且都不会被销毁)
  • 被static修饰的局部变量,只会占用一块内存,在整个程序运行过程中都不会销毁,只会初始化一次
    • 作用域不变(原来在什么作用域中还在什么作用域中)
    • 生命周期改变(生命周期变长)

2. const

  • const值修饰它右边的内容,被const修饰的内容都是常量,都不能再修改

3. extern

  • 可以用来引用一个全局变量常量

四.应用全局常量--Const.h/.m

全局常量的写法

    1. 仅限于本文件访问
    • 在本文件中写下面的代码
    • static 类型 const 常量名 = 常量值;
    1. 全世界都访问
    • 在LNConst.m文件中
      • import <UIKit/UIKit.h>

      • 类型 const 常量名 = 常量值;
    • 在LNConst.m文件中
      • import <UIKit/UIKit.h>

      • UIKIT_EXTERN 类型 const 常量名;
    • 在pch文件中包含LNConst.h
  • 注意 定义结构体(如CGRect)的时候想用全局常量可以使用大括号赋值{{,},{,}}
原文地址:https://www.cnblogs.com/KrystalNa/p/4806015.html