const与#define的区别

编译器处理方式不同

define宏是在预处理阶段展开。

补充:预处理器根据以#开头的命令,修改原始的程序。比如我们常见的#include <stdio.h>命令告诉处理器读取系统头文件stdio.h的内容,并把它直接插入程序文本中。咱们的#define也是,仅仅是单纯的文本替换。

const常量是编译运行阶段使用。

类型和安全检查不同

define宏没有数据类型,不做任何类型检查,仅仅是展开。

const常量有具体的数据类型,在编译阶段会执行类型检查。

存储方式不同

define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。

const常量会在内存中分配(可以是堆中也可以是栈中)。

const  可以节省空间,避免不必要的内存分配。

例如:

#define PI 3.14159 //常量宏
const doulbe Pi=3.14159; //此时并未将Pi放入ROM中
double i=Pi; //此时为Pi分配内存,以后不再分配!
double I=PI; //编译期间进行宏替换,分配内存
double j=Pi; //没有内存分配
double J=PI; //再进行宏替换,又一次分配内存!

const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而 #define定义的常量在内存中有若干个拷贝。

代码调试不同

const常量可以进行调试的。

define是不能进行调试的,因为在预编译阶段就已经替换掉了。

const优点

const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。

有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。

const可节省空间,避免不必要的内存分配,提高效率。

#define的优点

宏可以定义一些函数,const不可以

宏可以使代更码简洁

使用宏可以方便代码维护

宏还可以定义带参数的宏,做到一定程度的泛型(利用#或者##操作符)

最新文章

  1. 0025 Java学习笔记-面向对象-final修饰符、不可变类
  2. web前端,移动开发规范概述
  3. 可以编辑R代码的eclipse插件
  4. 实验一 Java开发环境的熟悉
  5. SQL逻辑读变成零
  6. Codeforces Round #260 (Div. 2) A B C 水 找规律(大数对小数取模) dp
  7. C++ 字符串相关函数
  8. 第一次使用unity3d
  9. Mysql-如何正确的使用索引以及索引的原理
  10. Could not autowire. No beans of &#39;xxxx&#39; type found的错误
  11. 安装软件出现缺少vcruntime140.dll
  12. python异常处理的两种写法
  13. Linux电源管理【转】
  14. border的特殊用法
  15. 使用fastjson解析数据后导致顺序改变问题
  16. Load balancing 各组件的比较
  17. urllib 和urllib2 模块使用简例
  18. VS Code配置初探
  19. C++ 的一个问题的理解(私有变量成员)
  20. (转)MapReduce Design Patterns(chapter 4 (part 1))(七)

热门文章

  1. jQuery---京东轮播图
  2. Java Day2(下)
  3. 已经安装了 AccessDatabaseEngine.exe,还是报错
  4. windows上快速新建1g的文件
  5. 论文阅读笔记(二)【IJCAI2016】:Video-Based Person Re-Identification by Simultaneously Learning Intra-Video and Inter-Video Distance Metrics
  6. Java世界最常用的工具类库
  7. SUSE中搭建kafka
  8. docker安装elasticsearch和head插件
  9. PHP csv文件30w+数据导入mysql数据库
  10. java内部类概念