之前的章节中讲过预处理器命令大多用编译时的代码替换,而应用得最多的情况就是当我们需要重复多次写同一段代码的时候可以用一个简短的表达来代替,让编译器帮助我们写较长的代码,这也就是C++中的宏(Macro)。宏的一个常见的例子就是常量字面量的声明。
动手写3.6.4
动手写3.6.4使用宏定义圆周率并计算出圆的面积。运行结果如图3.6.3所示:
图3.6.3 宏的使用
这看似是定义了一个const常量,其实区别很大。宏不过是做了替换,将define后面紧跟的PI全部替换成3.14,而且并没有指定数据类型,这种单纯的替换其实是会导致一些问题的。
动手写3.6.5
动手写3.6.5展示了宏的不当使用所带来的问题。运行结果如图3.6.4所示:
图3.6.4 宏的不当使用
我们预想的运行结果应该是6,实际结果却显示为4。这是因为宏简单地将1+1替换到算式中使之变成1+1*3,然而按照优先级,会先计算乘法,导致结果与预想的不一致。所以在定义宏的时候添加括号是一个良好的习惯,在这里我们应该把宏定义写成“#define onePlusOne (1+1)”。
宏也支持参数,这跟后面要讲的函数很像,我们可以借助宏实现一些小的功能。
动手写3.6.6
动手写3.6.6展示了带参数的宏。我们用宏实现了取最大值和最小值的操作并可以反复使用。运行结果如图3.6.5所示:(www.xing528.com)
图3.6.5 带参数的宏
此外,当宏比较复杂,需要换行的时候,我们也可以使用分行符来连接两个相关的行。
动手写3.6.7
动手写3.6.7展示了分行符的使用。运行结果如图3.6.6所示:
图3.6.6 分行符的使用
在这个示例中,我们用分行符将3个参数的max操作分成3行,这样看起来会更加易读,但是编译器在预处理时还是会压成一行放在使用max的地方。
分行符也能在一般的代码中使用,但要注意一般的语句有分号或者括号作结尾,一般换行时也不需要使用分行符,而即使加了分行符也不会有问题。但是字符串因为太长,需要换行的时候就必须使用分行符了。
动手写3.6.8
动手写3.6.8展示了分行符在普通代码中的几种应用。运行结果如图3.6.7所示:
图3.6.7 普通代码中的分行符
如果字符串换行不用分行符,就会产生编译错误。
虽然宏使用起来很方便,但它毕竟是C++继承自C语言的功能,C++本身已经支持可以替代大多数宏用法的const和inline函数了,所以为了避免不必要的麻烦以及简化调试(多行的宏虽然使用分行符但本质还是一行,断点无法进入每个语句),还是尽量使用C++本身的功能比较好。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。