从头到脚 发表于 2015-4-9 09:35

看了此文,才明白const和#define的区别【转帖】

本帖最后由 sdnumcu 于 2015-8-23 21:54 编辑


      const,翻译做中文就是:不变的。程序猿们对此肯定不陌生,代码中经常见,毕竟代码中加点const有点玄乎,甚至可能是大神的标志性动作,就像没事回头总想甩甩头发一样,不为别的,就为那一刹那的电力十足。OK,那程序中的const到底是干什么呢?今天我不为别的,就为了日后自己不犯二,特地反思一下这个const。
      提到const,那么就不得不提define这个东西。在很久很久以前,我始终相信const和define是差不多的(那时候我是灰常不愿意用指针的,那是我的数组年代),相信很多朋友都有这样的感觉,初看之下,确实是那么回事,用define的地方const差不多都可以搞定,用const的地方貌似define也差不多。有一天有位大牛告诉我define不用占用空间,而const还占用空间,相比之下,define更好。
      现在想想,不尽然是这样的,比方#define CN_DEFINE_NAME "BigGod",相信这个字符串肯定在你的代码中占有一席之地。那么除此之外,他们就真的差不多么?非也,当工程比较大,采用库操作的时候,立马就不一样了,举个简单的例子,__DATE__这个宏表示的编译日期,当编译A库的时候他的值可能是2015/03/01,编译B的时候可能就是2015/04/05,毕竟不同部门的人做的事情,那么问题就来了,到底该信谁呢?如果是const就立马不一样了,因为这个变量就一个值(常规情况下),初始化的时候是多少就是多少。
      还有些同事在为一些事情发愁:const的东西到底能不能更改。说不能更改的人认为别人明明就是不能更改的意思,怎么可能被改呢?说能更改的朋友说,只要我能弄到你的地址,我自然就能改掉你,int const b =3,int *a;a =&b;*a =4;这还不是分分钟就能搞定!前者毕竟是个很规则的程序猿,写出的代码毕竟工工整整,warning都不会有一个,即使最严格的情况;后者可能了解的多些,但是可能还需要点补充,取地址赋值是没有错,但是还有一条,你要保证这个地址是可写的。在代码的链接阶段,const定义的符号表一般被指定到.romdata中,该段经常和代码等一起放在只读的地址上。玩Linux的都知道,RXW权限吧,向一个没有W权限的地方写东西该是多么危险,异常应该是免不了的。如果你没有异常,可能是你侥幸的没有MMU,侥幸的遇到所有的代码都是RXW的RAM而不是ROM.程序毕竟还是要给人看的,如果你不喜欢糊弄别人,那么const还是按照他字面的意思来还是比较好。      
      关于const指针的问题,指针常量还是常量指针,大家经常的傻傻分不清楚,关于这个问题,有一句口诀:*(指针)和const(常量)谁在前面先读谁,指针常量表示这个指针是常量,常量指针表示这个指针指向的东西是个常量,酱紫大家应该记得差不多了吧。OK,有点迷糊了,该洗洗睡了。。。。就这么多了吧,很多词不达意的地方,有错误漏洞的地方大家要不吝勘正啊。

zhusizhan 发表于 2015-4-9 11:43

#define 定义的东西,在执行阶段不被引用,就不会占用空间(RAM/ROM)
const定义的东西, 任何阶段都将占用空间(ROW)

ADS1993 发表于 2015-8-21 22:02

前来学习一下

tianxiongweitxw 发表于 2021-1-11 16:19

学习了

shamrocks 发表于 2021-2-7 15:05

本质的区别就是,#define 是替换。去面试,这么回答,面试官都理由挑毛病
页: [1]
查看完整版本: 看了此文,才明白const和#define的区别【转帖】