
#define和const的区别(转)
发布日期:2021-05-09 00:19:31
浏览次数:15
分类:博客文章
本文共 1776 字,大约阅读时间需要 5 分钟。
这个区别用从几个角度来说:
角度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,占用数据段空间角度5:从代码调试的方便程度而言:const常量可以进行调试的,define是不能进行调试的,因为在预编译阶段就已经替换掉了角度6:
从是否可以再定义的角度而言:const不足的地方,是与生俱来的,const不能重定义,而#define可以通过#undef取消某个符号的定义,再重新定义。角度7:
从某些特殊功能而言:define可以用来防止头文件重复引用,而const不能,可以参看下面代码://主要把以下代码放在头文件中,可以防止头文件被重复引用
#ifndef xxx//如果没有定义xxx#define xxx//定义xxx//这里是你的代码
#endif //结束如果
PS: 下面说一下,头文件被重复引用的弊端:(1) 有些头文件重复引用只是增加了编译工作的工作量,不会引起太大的问题,仅仅是编译效率低一些,但是对于大工程而言编译效率低下那将是一件多么痛苦的事情。(2) 有些头文件重复包含,会引起错误,比如在头文件中定义了全局变量(虽然这种方式不被推荐,但确实是C规范允许的)这种会引起重复定义。角度8:
从某些复杂功能的实现的实现角度来看:使用define会使得代码看起来非常简单,而const无法实现该功能例如,MFC在实现六大核心机制中,大量使用了define1、MFC程序的初始化2、运行时类型识别(RTTI)3、动态创建4、永久保存5、消息映射6、消息传递比如,在实现RTTI功能的时候,定义了如下宏,代码如下:
#define DECLARE_DYNCREATE(class_name) \
DECLARE_DYNAMIC(class_name)\
static CObject* PASCALCreateObject();
最后做一下小结:从上面的各个角度,我们可以看到define和const直接的区别在某个点上同C语言与JAVA语言有一定的相似性,之所以这么说,原因如下:(1) JAVA中内部对象高度封装,比如对于内存的回收机制而言更是自动完成,不需要程序员多费心;而C语言中,每次我们用指针申请一段空间时,我们都需要仔细考虑,这个指针后面会不会还要使用,现在是不是可以释放了,会不会成为野指针等等问题,所有的内存相关问题都需要程序员自己考虑,但是好处是,C语言可以直接方便的操作内存,这是一把双刃剑,用得好事半功倍,用得不好,内存泄漏,指针跑飞,问题到处都是,就算抓到了dump,用windbg也不好分析(特别是跨模块的情况)(2) C语言和JAVA语言的差异点类比到define和const,我这里只是想强调define的作用非常强大,虽然它没有类型检测,不能调试,还要考虑边界效应,但是正因为没有类型检测,预编译是就完成,才使得它的使用更加灵活,功能更加强大,如果我们可以善用define,往往可以发挥到意想不到的效果。————————————————版权声明:本文为CSDN博主「aaronymhe」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/yi_ming_he/article/details/70405364发表评论
最新留言
很好
[***.229.124.182]2025年04月06日 21时12分04秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
深入探索Android热修复技术原理读书笔记 —— 热修复技术介绍
2021-05-09
百度前端技术学院task16源代码
2021-05-09
解析js中( ( ) { } ( ) )的含义
2021-05-09
js设计模式总结5
2021-05-09
Python大神编程常用4大工具,你用过几个?
2021-05-09
一文带你了解图神经网络
2021-05-09
9个常用ES6特性归纳(一般用这些就够了)
2021-05-09
3D渲染集群,你了解多少?
2021-05-09
除了方文山,用TA你也能帮周杰伦写歌词了
2021-05-09
关于GO语言,这篇文章讲的很明白
2021-05-09
华为云FusionInsight湖仓一体解决方案的前世今生
2021-05-09
大数据处理黑科技:揭秘PB级数仓GaussDB(DWS) 并行计算技术
2021-05-09
C++调用Go方法的字符串传递问题及解决方案
2021-05-09
云原生2.0时代下,DevOps实践如何才能更加高效敏捷?
2021-05-09
技巧收藏|10个JavaScript常用数组操作方法
2021-05-09
两种端到端通用目标检测方法
2021-05-09
探索语言交互技术在政务数字化的应用
2021-05-09
让 AI “潜入”物流中心,你的快递很快就到!
2021-05-09
云小课 | 守护网络安全不是问题,iptables的四表五链为你开启“八卦阵”
2021-05-09
LiteOS内核源码分析:任务栈信息
2021-05-09