打印
[内核技术]

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

[复制链接]
2112|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
从头到脚|  楼主 | 2015-4-9 09:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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,有点迷糊了,该洗洗睡了。。。。就这么多了吧,很多词不达意的地方,有错误漏洞的地方大家要不吝勘正啊。
评论
zhengfish 2020-11-16 16:46 回复TA
const定义,分配一次空间,内容不能改变。 define是替换和复制,字符级别的,特别要注意括号、符号连接。 

相关帖子

沙发
zhusizhan| | 2015-4-9 11:43 | 只看该作者
#define 定义的东西,在执行阶段不被引用,就不会占用空间(RAM/ROM)
const定义的东西, 任何阶段都将占用空间(ROW)

使用特权

评论回复
板凳
ADS1993| | 2015-8-21 22:02 | 只看该作者
前来学习一下

使用特权

评论回复
地板
tianxiongweitxw| | 2021-1-11 16:19 | 只看该作者
学习了

使用特权

评论回复
5
shamrocks| | 2021-2-7 15:05 | 只看该作者
本质的区别就是,#define 是替换。去面试,这么回答,面试官都理由挑毛病

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

5

帖子

0

粉丝