宏只是字符的替换,在预处理阶段就被替换到代码中去了,而函数则是需要分配栈空间,在执行函数时都要进行入栈和出栈操作,有的还需要分配堆空间。宏所实现的功能有限,而且长代码不易读,但是对于逻辑简单,代码不长的,经常使用的功能由宏定义是个不错的选择。此外,函数调用会带来额外的开销,他需要开辟一片栈空间,记录返回地址,将形参压栈,从函数返回还要释放堆栈,这种开销不仅会降低代码效率,而且代码量也会大大增加,而使用宏定义则在代码规模和速度方面都比函数更胜一筹;其次,函数的参数必须被声明为一种特定的类型,所以它只能在类型合适的表达式时试用,我们如果要比较两个浮点型的大小,就不得不再写一个专门针对浮点型的比较函数。反之,上面的宏定义可以用于×××,长×××,单浮点型,双浮点型以及其他任何可以用“>”操作符比较值大小的类型,也就是说,宏是与类型无关的。
   和使用函数相比,使用宏的不利之处在于每次使用宏时,一份宏定义代码的拷贝都会插入到程序中,除非宏非常短,否则使用宏会大幅度增长程序的长度。
   还有一些任务根本无法用函数实现,但是用宏定义却很好实现。比如参数类型没法作为参数传递给函数,但是可以把参数类型传递给带参的宏。