预计阅读本页时间:-
许多任务既可以使用带参数的宏完成,也可以使用函数完成。应该使用宏还是函数呢?没有硬性的规则,但应考虑以下几点。
在使用宏时,若不注意的话会产生一些奇怪的现象。因此,宏在某种程度上比常规的函数复杂。有些编译器限制宏只能定义成一行。即使您的编译器没有这个限制,也应遵守这个限制。
广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元
宏与函数间的选择实际上是时间与空间的权衡。宏产生内联代码;也就是说,在程序中产生语句。如果使用宏20次,则会把20行代码插入程序中。如果使用函数20次,那么程序中只有一份函数语句的拷贝,因此节省了空间。另一方面,程序的控制必须转移到函数中并随后返回调用程序,因此这比内联代码花费的时间多。
宏的一个优点是它不检查其中的变量类型(这是因为宏处理字符型字符串,而不是实际值)。因此,对于int或float都可使用宏SQUARE (×)。
C99提供了第三种可选方法:内联函数。本章后面部分将进行讨论。
程序员一般将宏用于简单函数,如下所示:
(如果×为一个代数符号字符,那么最后一个宏的值为1,即为真。)
下面是需要注意的几点:
● 记住,宏的名字中不能有空格,但是在替代字符串中可以使用空格。ANSIC允许在参数列表中使用空格。
● 用圆括号括住每个参数,并括住宏的整体定义。这样能确保被括起来的部分在下面这样的表达式中也会被正确分组:
● 用大写字母表示宏函数名。该约定不如使用大写字母表示宏常量的约定用得广泛。但是,使用大写字母可以提醒程序员注意宏可能产生的副作用。
● 如果打算使用宏代替函数来加快程序的运行速度,那么首先应确定宏是否会引起重大差异。在程序中只使用一次的宏对程序运行时间可能不会产生明显的改善。在嵌套循环中使用宏更有助于加速程序运行。许多系统提供程序配置器以帮助程序员压缩最耗费运行时间的程序部分。
假如已经开发了一些自己喜欢的宏函数,那么,是不是每次编写新程序时都要重新输入这些宏函数呢?如果您还记得#include指令,就不用每次重写代码了。下面我们回顾#include指令的用法。