首先讲C编译器的内存分配:
代码区 |
数据区 |
用户区=线程栈+堆 |
其中的数据区存储:常量(define)+静态变量(static)+符号集(const)+全局变量
然后讲一下编译的大致顺序:
注释-->
预处理-->
编译-->
连接。
它们的保存:
const修饰的是变量,会被编译到符号集中去,它本身是变量这是个大前提,如果把这个概念弄错了,你就会很可能会用这个变量来做数组的维数,而数组的维数只能是常量,这点要明白。
define定义的常量就可以作为数组的维数,它当然是保存在数据区的常量空间内,并且它发生在预处理阶段,相对const变量的处理要早。
static修饰的变量则被编译进数据区的静态空间内,同const修饰的变量和define定义的常量一样,一直存在,直到程序终止。
它们的初始化(如果有的话)
const修饰的变量是在编译时放到了符号集中,只是在第一次使用的时候分配空间,没有什么初始化这样的概念。
define定义的变量则是在每次出现在“=”的右边时都会分配空间,你要注意是都分配了空间。至于在预处理的时候有没有分配空间的概念,我自己尚不清楚。
static修饰的变量的初始化要等到运行的时候。
它们存在的目的:
const和static修饰的数据都是有类型的,由于const修饰变量常常理解成常量,它可以看做是取代define定义的无类型常量的。
static修饰变量则多在子函数中使用,你大可发挥一下,找到它的妙用。