预编译
预编译 是做些代码文本替换的工作。
处理#开头的指令,比如#define宏定义
,#include
包含的文件代码,条件编译
等,就是为编译做的预备工作的阶段。
内存区域
栈
:在函数执行时,函数内部的局部变量(不包括静态局部变量)存在栈中,函数结束时这些存储空间自动被释放。
堆
:动态分配内存使用的区域,通过malloc或new创建,使用完之后我们需要手动释放,否则认为产生了内存泄漏。即使程序运行结束后,机器会自动释放堆。
静态存储区
:这一块的内存在程序编译时就已经存在了,主要存放静态变量,全局变量和常量等。
局部变量和全局变量
局部变量
:他在程序运行期间不是一直存在,只有在函数调用时存在,在函数退出时销毁。
全局变量
:全局变量具有全局作用域,只需要在一个源文件中定义就可以在所有cpp文件中使用,通过extern关键字声明。
静态局部变量
:静态局部变量只在初次调用的时候初始化,直到程序关闭。静态局部变量的作用域是局部的,只对定于他的函数可见。
静态全局变量
:静态全局变量与全局变量一样具有全局作用域,但是有所不同的是,因为有static关键字修饰,所以不能被其他cpp文件extern,即使在其他cpp文件中出现同名变量,也只是另一个全新的个体。
define 和const
- define 是宏定义,是在预编译阶段就进行了文本替换,没有类型检查,也不分配空间,所以程序中不可修改(因为没有内存地址)
- const 是在编译阶段处理,有类型检查,会有错误提示
- define 可以定义一些简单的函数,而const 只能定义常量
- 大量的使用宏,会造成编译时间久
- 苹果官方不推荐我们使用宏,推荐使用const常量
static 和 const
- static 修饰的局部变量,改变了变量的存储区域,本来局部变量是放在栈区,超出其作用域(当前函数或代码块)就会被释放,但是static修饰后,存储区域放在了静态区(全局数据区)(编译时就分配了内存),程序结束时才会被释放,但是其作用域还是函数或代码块内部。下次访问的还是同一内存的数据。
- const 修饰的变量为只读的,不可以修改。当其修饰全局变量时,可以通过extern 关键字 让所有文件都可以访问。
- static 和 const 一起使用,是为了将常量的作用域限制在当前声明的文件内,其他文件不可以访问。(不可以使用extern 暴露出去,不然会报错)
参考:
https://www.csdn.net/tags/MtjaAgxsODU5NzYtYmxvZwO0O0OO0O0O.html