C语言——#define与const的区别
define与const都与常量有关。define是宏定义,它可以把一个标识符变成一个常量,而const是一个修饰符,它可以修饰一个变量为常类型,使其不可被修改。
- 本质上两者不同,define修饰出来的是常量。并且是真常量。
- 而const修饰的是假常量,它本质还是变量,只不过是不能修改值。
- 为什么说define修饰出来的是真常量呢?因为,define是宏定义,是宏替换!意味着程序在编译前期会进行文本替换,例如代码define PI 3.14,编译器会将代码中所有出现PI的地方全部用3.14替换,然后在进行编译,所以本质它就是一个常量!
- 至于const,const一般修饰于定义变量的前面,比如const int a=10,意味着a就一直是10,是一个不可修改的变量。
- 往后视图给a重新赋值都会引发错误。这就是const修饰之后的结果,但请注意这里不可修改的原因其实是编译器在做检查,检查是否有修改这块内存上的值,一旦有就会报错!所以从根本上说,const修饰的变量依然是一个变量!只不过编译器不让修改而已!
两者的区别
- 编译器处理方式不同
- define 宏是在预处理阶段展开。
- const 是编译运行阶段使用。
- 类型和安全检查不同
- define 宏没有类型,不做任何类型检查,仅仅是展开。
- const 有具体的类型,在编译阶段会执行类型检查。
- 存储方式不同
- define 宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存(宏定义不分配内存,变量定义分配内存)。
- const 会在内存中分配(可以是堆中也可以是栈中)
- const可以节省空间,避免不必要的内存分配。
- const 定义常变量从汇编的角度来看,只是给出了对应的内存地址,而不是像define一样给出的是立即数,所以,const定义的常变量在程序运行过程中只有一份拷贝(因为是全局的只读变量,存在静态存储区),而define定义的常变量在内存中有若干个拷贝。
- 编译器通常不为普通const常变量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很好。
- 宏替换只做替换,不做计算,不做表达式求解。
- 宏预编译时就替换了,程序运行时,并不分配内存。
总结
类别 | define | const |
---|---|---|
何时处理 | 编译期间进行宏替换 | 编译期间检查是否有修改 |
谁来执行 | 由系统判断是否被修改 | 由编译器限制 |
存储位置 | 数据常量在内存只读区 | 变量在哪里就在哪里 |