第一篇 宏
宏对于我们来说应该是很简单的东西了,不过也不要信以为真,宏要复杂起来可以达到让你去撞墙的地步。不信等你学习了MFC后,你会发现,MFC把宏用得真是出神入化,真是鬼斧神工。那里的复杂一般人还真要点心理承受能力的。不过,使用起来却是异常的方便,复杂是内部的包装实现,要是不去深究,也没什么。宏就是一个替代机制,最简单的就是像这样的,#define MAX 255 这种用法,这种很简单。单独看这个,确实没什么好说的。但是把这些容在一起,就可能混淆了,迷糊了。这也是我在使用枚举、常量和宏时突然晕乎了才花时间将这些整理清楚。所以,肯定也不是无聊没事干来整这些没用的东西。简单的情况的时候,很多东西就不值得讨论,但是使用环境变复杂了,很多简单的东西就是因为平时以为简单,却没有把简单的东西归并到统一的思想中,最后支离破碎,丢三落四,学习和使用效率就低了,编码时经常纠结于这些小东西,经常带来bug。经过一小段时间的迷糊,最好要将相关的东西对比整理一下。
我们提到宏都第一反应是替代作用,也就是说,编译时会将这些符号用定义的值替代回去。这就是我们所认识的宏。不过在实践中,我又发觉,其实我们可以讲宏当做常量来理解,不过实质上也确实是常量。所谓的常量,就是一个在运行程序不变的东西,也就是事先我们在写代码时写死的值。那么宏定义的值就是一个常量。包括定义的其他表达式函数名等,都可以看做是一个常量。
而根据测试,#define 是有作用范围的,全局define可以全局替换,局部define可以局部替换,局部的定义在其他地方无法识别我们定义的宏符号。而这个特性以及宏定义的东西是不可以更改值的,因此就在逻辑层面上可以理解为常量了,至于实现机制则是替换,替换的目的就实现了常量的特性。因此,从某种角度来看,宏确实可以看做是一种常量。
所以在平常使用时,就可以以常量的思维来对待宏,而不用单独看做特别的宏,这样就可以将宏和常量在某种意义上统一起来,这就是统一归纳,合二为一。这样在使用时,普通使用常量时基本就可以用宏来代替。好处是有的,那就是不占内存,因为宏在编译时就替换,反正运行时不能改变,用宏就可以提高执行效率了,减少内存空间了,并且宏还有作用范围,也就可以当做局部宏,相当于局部常量来使用。所以在平时定义数组时,就可以使用诸如char name[MAX]来定义,不管MAX是宏还是常量都可以,并且宏效果更好。