打印

讨论宏的优缺点,请各抒己见!

[复制链接]
3800|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
一棵小草|  楼主 | 2010-4-17 22:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
看到一个“宏定义学习手记”的帖子,很多人,不管懂还是不懂都帮顶,自己有点感想,所以把想法说出来,让大家来讨论。[只对汇编语言]

宏,简单来说,可以理解成替换,代表的意思。比如  M_InitTime0    EQU   20H,可以理解成20H可用M_InitTime0来替换,或者说M_InitTime0就是代表20H。同样的道理,也可以把一段代码定义成一个宏,用这个宏来代替这段代码。在编译的时候,如果遇到M_InitTime0就用20H来替换,如果遇到宏函数,就用那段代码来替换宏。

问过许多人,为什么喜欢用宏?大多数的回答是说:很方便。大部分人的答案第一句就是这个了,具体的再问,就各有各的想法了。主要有2点:
1、定义常量很方便,比如程序中有个数值115864,看程序的人也许不知道什么意思,但是如果宏定义System_Clock   EQU   115864,然后程序中看到System_Clock就知道什么意思,还有其他定义方便就不说了。
2、宏函数调用,带参数很方便。因为汇编语言中,子函数带参数,用起来有点“丑”,而且如果是多个参数的话要用到堆栈,用起来更“丑”,涉及到压栈,程序就有跑飞危险!对于高手来说,主要的还是方便调用,确实,宏函数调用最多一行,挺漂亮的。

宏虽然用起来很方便,但是,宏最好也别滥用和乱用。用了宏,程序的行数确实少了,但是不要以为是程序精短了哦,相反的,宏函数用得越多,程序的质量越差,代码空间浪费的也多。为什么呢?因为,宏函数是替换,而不是跳转地址!跟子函数的原理不一样,宏函数是一段程序代替宏名的位置,子函数是跳转到指定地址。比如:
TCCA_SETUP     MACRO     TCCACNT
         clr       0x04             ; 0x04 是用来做临时寄存器用的
         ior       0x08             ; 0x08是控制TCCA的寄存器
         and       a,@0xf8          ; 屏蔽掉TCCA相关的
         mov       0x04,a           
         mov       a,@TCCACNT    ; 读取传递进来的参数
         or        a,0x04
         iow       0x08
         mov       a,@TCCACNT   ; 如果允许TCCA的话,开TCCA的中断
         and       a,@0x04         ; 否则直接跳出
         jbc       0x03,2
         jmp       $+4
         ior       0x0f
         or        a,@0x08
         iow       0x0f                        
ENDM

拿这个宏来说吧,调用的时候,宏里面的代码会替代宏名TCCA_SETUP出现的地方,当然这里只做初始化还没什么,但是如果调用上了10次呢,按照这个来说,就会比子函数方式多出14*10条指令!

所以宏并不是什么都好,用宏的时候要特别留心了。
1、不能什么都用宏定义,最起码要有代表性!因为你是宏的作者,你会自认为对你来说很方便,也肯定容易看得明白!但是,对别人来说就是一种折磨了,想想看,如果一个工程里有几百个“你认为很方便的”宏定义常量,别人看到的也许是头大。
2、一定要写注释!这个就什么好说的了。

3、精短的,不复杂的,常用到的,可以写成宏函数。但是,不推荐长的,算法复杂的,常用的宏函数,书上也是这样推荐的!

初学者有一种趋势,喜欢用宏定义,那时因为上面的方便。高手也许常量宏定义多,但是宏函数估计不多。当然,对于宏函数中调用子函数的方法,本人是推荐的,因为它跟子函数调用的原理一样,只是美化了而已。

我声明,我不是高手,反而是那种喜欢研究程序结构,程序算法,程序质量,精简程序的人。因为宏的使用,如果滥用乱用,会对阅读造成影响,会对程序精简造成影响,故此提出,望高手能改变我的想法。

相关帖子

沙发
maomao2126| | 2010-4-17 22:44 | 只看该作者
适当的位置恰当使用

使用特权

评论回复
板凳
一棵小草|  楼主 | 2010-4-18 12:09 | 只看该作者
适当的位置恰当使用
maomao2126 发表于 2010-4-17 22:44

说得很不错

C语言还好,使用宏函数的情况较少,我认为是C能带好多参数呢。。。

使用特权

评论回复
地板
HWM| | 2010-4-18 14:15 | 只看该作者
本来就没有“宏函数”一说。

使用特权

评论回复
5
一棵小草|  楼主 | 2010-4-18 18:53 | 只看该作者
本来就没有“宏函数”一说。
HWM 发表于 2010-4-18 14:15


你可以当作我创造好了,明白我意思就行,主题的意思很明确。

我看到很多人盲目用宏才提出来的,我只想知道你的看法。

使用特权

评论回复
6
shaky| | 2010-4-18 20:10 | 只看该作者
啥叫缺点?   只是用的人用的好与不好的问题.

使用特权

评论回复
7
chl00100| | 2010-4-18 20:31 | 只看该作者
1.比如有一个常量1024在很多地方都会用到,那我就喜欢定义一个宏,修改方便,以后移植也方便;
2.程序中如果需要加调试信息,我也会定义一个宏来代替printf,想禁止时方便;
还有,,,暂时没有想到,,

使用特权

评论回复
8
一棵小草|  楼主 | 2010-4-18 20:49 | 只看该作者
啥叫缺点?   只是用的人用的好与不好的问题.
shaky 发表于 2010-4-18 20:10


怎么样才好与不好呢

使用特权

评论回复
9
一棵小草|  楼主 | 2010-4-18 20:50 | 只看该作者
1.比如有一个常量1024在很多地方都会用到,那我就喜欢定义一个宏,修改方便,以后移植也方便;
2.程序中如果需要加调试信息,我也会定义一个宏来代替printf,想禁止时方便;
还有,,,暂时没有想到,, ...
chl00100 发表于 2010-4-18 20:31


赞同你的话

使用特权

评论回复
10
一棵小草|  楼主 | 2010-4-18 20:50 | 只看该作者
用宏确实有时候很方便,但是像上面说的一样,一段代码写成一个宏,多用的话就多占用空间,我认为一个好的软件设计者,应该要考虑到内存,空间等问题。如果你作为一个程序阅读者,当你看到一百多个宏常量时,你有什么感想?当你在程序中遇到宏,你是否会去查看宏的定义?当你找了几个文件,终于找到时的感想如何?

使用特权

评论回复
11
后学| | 2010-4-19 08:42 | 只看该作者
所谓的“宏函数”
1、比函数快;
2、经常是对函数的简单包装;
3、容易滥用;
4、一定要注意多加括号;

其实很多常用的函数库中都有宏的身影,

使用特权

评论回复
12
HWM| | 2010-4-19 08:57 | 只看该作者
再重声一遍:根本没“宏函数”那么一回事,那东东和“in line function"不能混为一谈。“宏”只是个编辑助手而已。

使用特权

评论回复
13
ayb_ice| | 2010-4-19 09:06 | 只看该作者
要是看过高手写的宏汇编你就知道宏好不好了
C宏(准确的讲应该是预处理)更牛了,夸张点: C宏只有想不到,没有做不到。。。

使用特权

评论回复
14
xlsbz| | 2010-8-14 14:17 | 只看该作者
关于宏 没别的 就是尽量少把函数弄成宏   

找高人的代码看看哪些可以用就行了

养成习惯就好了  就不想这个那个原因了

使用特权

评论回复
15
zhuzheic| | 2010-8-14 19:54 | 只看该作者
感觉还是用最常规的思想去写程序,不然离开了你谁也看不懂了。特别是宏这东西,好用是好用,但很如果真的出现错误要找出来就不容易了。好习惯很重要。

使用特权

评论回复
16
hotpower| | 2010-8-16 22:15 | 只看该作者
宏让人能发挥更大的想象空间。
无嵌套限制的if else、case、while等是很好玩的。

使用特权

评论回复
17
int3| | 2010-8-16 23:27 | 只看该作者
宏能增加可读性和可维护性。

使用特权

评论回复
18
一棵小草|  楼主 | 2010-8-17 13:51 | 只看该作者
关于宏 没别的 就是尽量少把函数弄成宏   

找高人的代码看看哪些可以用就行了

养成习惯就好了  就不想这个那个原因了
xlsbz 发表于 2010-8-14 14:17


老哥,你行啊,几个月的贴了,还被你挖出来,IFU。
我错了,上次我不该说你自恋的,你本来爱挖沉帖。
不会是来报复我吧:L 。。。
我承认,我不喜欢宏定义,特别是滥用。。。

使用特权

评论回复
19
xlsbz| | 2010-8-17 22:03 | 只看该作者
再得瑟 拔了你:lol

使用特权

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

本版积分规则

0

主题

291

帖子

1

粉丝