首先明确一点,静态变量(Static Variable)可以被修改,常量的值才不能变。
#define是宏不是定义变量。预处理的时候直接就换掉了,不参与编译。
const定义变量在CPP11之后也是直接替换,可是是在编译过程中的。
static定义静态变量,文件作用域。其他文件使用请用extern。
他们没有联系只有区别:不同层面上的东西。
#define: 预处理层面上的替换,不存在于语意层面
static: 变量的作用域控制
const: 变量的访问控制:只读
共同点:
1、static和const在编译时直接分配内存。
在C语言及由其派生出的C++与Objective-C等程序语言中,“static”是用于控制变量的生命周期和连接方式(即其作用域,亦即可见性)的保留字。确切来说,正如C族语言中的extern,auto与register这些保留字一样,static也是一种存储类(此处的“类”与面向对象语言的“类”的定义不同)标识。每个变量与函数都有以上的一种存储类标识,如果在声明中没有明确标识其存储类,编译时就会根据上下文来选择其默认存储类,如在源文件里的所有文件级变量对应的默认存储类是extern,而在函数体内的变量对应的则是auto,各存储类的属性如下表所列。
摘自维基百科:https://zh.wikipedia.org/wiki/%E9%9D%99%E6%80%81%E5%8F%98%E9%87%8F