当前位置:   article > 正文

C语言——#define与const的区别

C语言——#define与const的区别

C语言——#define与const的区别

define与const都与常量有关。define是宏定义,它可以把一个标识符变成一个常量,而const是一个修饰符,它可以修饰一个变量为常类型,使其不可被修改。

  1. 本质上两者不同,define修饰出来的是常量。并且是真常量。
  2. 而const修饰的是假常量,它本质还是变量,只不过是不能修改值。
  • 为什么说define修饰出来的是真常量呢?因为,define是宏定义,是宏替换!意味着程序在编译前期会进行文本替换,例如代码define PI 3.14,编译器会将代码中所有出现PI的地方全部用3.14替换,然后在进行编译,所以本质它就是一个常量!
  • 至于const,const一般修饰于定义变量的前面,比如const int a=10,意味着a就一直是10,是一个不可修改的变量。
  • 往后视图给a重新赋值都会引发错误。这就是const修饰之后的结果,但请注意这里不可修改的原因其实是编译器在做检查,检查是否有修改这块内存上的值,一旦有就会报错!所以从根本上说,const修饰的变量依然是一个变量!只不过编译器不让修改而已!

两者的区别

  1. 编译器处理方式不同
  • define 宏是在预处理阶段展开。
  • const 是编译运行阶段使用。
  1. 类型和安全检查不同
  • define 宏没有类型,不做任何类型检查,仅仅是展开。
  • const 有具体的类型,在编译阶段会执行类型检查。
  1. 存储方式不同
  • define 宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存(宏定义不分配内存,变量定义分配内存)。
  • const 会在内存中分配(可以是堆中也可以是栈中)
  1. const可以节省空间,避免不必要的内存分配。
  • const 定义常变量从汇编的角度来看,只是给出了对应的内存地址,而不是像define一样给出的是立即数,所以,const定义的常变量在程序运行过程中只有一份拷贝(因为是全局的只读变量,存在静态存储区),而define定义的常变量在内存中有若干个拷贝。
  1. 编译器通常不为普通const常变量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很好。
  2. 宏替换只做替换,不做计算,不做表达式求解。
  • 宏预编译时就替换了,程序运行时,并不分配内存。

总结

类别defineconst
何时处理编译期间进行宏替换编译期间检查是否有修改
谁来执行由系统判断是否被修改由编译器限制
存储位置数据常量在内存只读区变量在哪里就在哪里
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/400411
推荐阅读
相关标签
  

闽ICP备14008679号