来源参考:https://blog.csdn.net/yi_ming_he/article/details/70405364

这个区别用从几个角度来说:

角度1: 就定义常量说的话:  const 定义的常数是变量 也带类型, #define 定义的只是个常数 不带类型。

角度2: 就起作用的阶段而言: define是在编译的预处理阶段起作用,而const是在 编译、运行的时候起作用。

角度3: 就起作用的方式而言: define只是简单的字符串替换,没有类型检查。而const有对应的数据类型,是要进行判断的,可以避免一些低级的错误。 正因为define只是简单的字符串替换会导致边界效应,具体举例可以参考下面代码:

#define N 2+3 //我们预想的N值是5,我们这样使用N

double a = N/2;  //我们预想的a的值是2.5,可实际上a的值是3.512

角度4: 就空间占用而言: 例如:

#define PI 3.14     //预处理后 占用代码段空间

const float PI=3.14;    //本质上还是一个 float,占用数据段空间12

角度5: 从代码调试的方便程度而言: const常量可以进行调试的,define是不能进行调试的,因为在预编译阶段就已经替换掉了

角度6: 从是否可以再定义的角度而言: const不足的地方,是与生俱来的,const不能重定义,而#define可以通过#undef取消某个符号的定义,再重新定义。

角度7: 从某些特殊功能而言: define可以用来防止头文件重复引用,而const不能,可以参看下面代码:

//主要把以下代码放在头文件中,可以防止头文件被重复引用

#ifndef xxx//如果没有定义xxx

#define xxx//定义xxx

//这里是你的代码

#endif //结束如果1234567

PS: 下面说一下,头文件被重复引用的弊端: (1) 有些头文件重复引用只是增加了编译工作的工作量,不会引起太大的问题,仅仅是编译效率低一些,但是对于大工程而言编译效率低下那将是一件多么痛苦的事情。 (2) 有些头文件重复包含,会引起错误,比如在头文件中定义了全局变量(虽然这种方式不被推荐,但确实是C规范允许的)这种会引起重复定义。

角度8: 从某些复杂功能的实现的实现角度来看: 使用define会使得代码看起来非常简单,而const无法实现该功能 例如,MFC在实现六大核心机制中,大量使用了define 1、MFC程序的初始化 2、运行时类型识别(RTTI) 3、动态创建  4、永久保存  5、消息映射   6、消息传递

比如,在实现RTTI功能的时候,定义了如下宏,代码如下:

#define DECLARE_DYNCREATE(class_name) \

DECLARE_DYNAMIC(class_name)\

static CObject* PASCALCreateObject();12345

最后做一下小结: 从上面的各个角度,我们可以看到define和const直接的区别在某个点上同C语言与JAVA语言有一定的相似性,之所以这么说,原因如下: (1) JAVA中内部对象高度封装,比如对于内存的回收机制而言更是自动完成,不需要程序员多费心;而C语言中,每次我们用指针申请一段空间时,我们都需要仔细考虑,这个指针后面会不会还要使用,现在是不是可以释放了,会不会成为野指针等等问题,所有的内存相关问题都需要程序员自己考虑,但是好处是,C语言可以直接方便的操作内存,这是一把双刃剑,用得好事半功倍,用得不好,内存泄漏,指针跑飞,问题到处都是,就算抓到了dump,用windbg也不好分析(特别是跨模块的情况) (2) C语言和JAVA语言的差异点类比到define和const,我这里只是想强调define的作用非常强大,虽然它没有类型检测,不能调试,还要考虑边界效应,但是正因为没有类型检测,预编译是就完成,才使得它的使用更加灵活,功能更加强大,如果我们可以善用define,往往可以发挥到意想不到的效果。 --------------------- 作者:aaronymhe 来源:CSDN 原文:https://blog.csdn.net/yi_ming_he/article/details/70405364 版权声明:本文为博主原创文章,转载请附上博文链接!

最新文章

  1. ArcGIS 最短路径计算
  2. [iOS翻译]《iOS 7 Programming Cookbook》:iOS文件与文件夹管理(上)
  3. Unity3D 判断鼠标是否按在UGUI上
  4. Git教程(9)集中式工作方式常用的设计分支的方案
  5. YII2数据库操作出现类似Database Exception – yii\db\Exception SQLSTATE
  6. Dij的堆优化
  7. 学习ExtjsFor.NET(第二个案例-Array的Every方法)
  8. 读书笔记之MERGE 语句使用
  9. MyEclipse2014 设备 checkstyle、PMD、findbugs 最简单的方法 详细说明
  10. tpcc-mysql的使用
  11. php获取两个时间戳之间相隔多少天多少小时多少分多少秒
  12. Wxpython入门
  13. java————数组 简单写出一个管理系统
  14. vue监听路由变化
  15. [Spark Core] Spark 使用第三方 Jar 包的方式
  16. javascript捕获事件event
  17. JavaScript高级 面向对象(11)--对象的动态特性-关联数组用法
  18. chattr lsattr
  19. 20145105 《Java程序设计》第9周学习总结
  20. android系统提供的几种颜色Color

热门文章

  1. 释放数据价值:DAYU数据运营新能力解读
  2. 让这个Java语言的开源商城系统火起来
  3. 实战解读丨Linux下实现高并发socket最大连接数的配置方法
  4. 小程序开发-使用Loading和Toast提示框
  5. [bash] 打印到屏幕相关语法
  6. PyCharm怎样添加Qt designer
  7. Linux:nginx基础
  8. 理解Spring AOP的实现方式与思想
  9. Solaris – configure ftp server
  10. docker下部署jira破解版