函数式宏
函数式宏(function-like macro)较之对象式宏可以进行更复杂的代换。
#define sqr(x) ((x) * (x))
函数和函数式宏
函数式宏sqr
是在编译时展开并填入程序的,因此只要是能用双目运算符*
进行乘法计算的数据类型,都能使用函数式宏。
函数定义则需为每个形参都定义各自的数据类型,返回值的类型也只能为一种。就这点而言,函数较为严格。
函数为我们默默无闻地进行了一些复杂处理,如:
- 参数传递(将实参的值复制到形参)
- 函数调用和函数返回操作(程序流程的控制)
- 返回值的传递
而函数式宏所做的工作只是宏展开和填入程序,并不进行上述处理。
根据以上特征,函数式宏或许能使程序的运行速度稍微提高一点,但是程序自身却有可能变得臃肿。
函数式宏在使用上必须小心谨慎。例如,sqr(a++)
展开后((a++) * (a++))
。每次展开,a
的值都会自增两次。在不经意间表达式被执行了两次,导致程序出现预料之外的结果,我们称这种情况为宏的副作用(side effect) 。
在定义和使用函数式宏时,请仔细考虑是否会产生副作用。
函数版的
sqr_int(a++)
,a
的值不会递增两次,如果是宏版,则要将sqr(a)
和a++
分开。
网友评论