往事C语言CC语言&嵌入式

C语言-函数式宏

2018-09-27  本文已影响1人  Jimmy_L_Wang

函数式宏

函数式宏(function-like macro)较之对象式宏可以进行更复杂的代换。

#define sqr(x) ((x) * (x))    

函数和函数式宏

函数式宏sqr是在编译时展开并填入程序的,因此只要是能用双目运算符*进行乘法计算的数据类型,都能使用函数式宏

函数定义则需为每个形参都定义各自的数据类型,返回值的类型也只能为一种。就这点而言,函数较为严格。

函数为我们默默无闻地进行了一些复杂处理,如:

而函数式宏所做的工作只是宏展开和填入程序,并不进行上述处理。

根据以上特征,函数式宏或许能使程序的运行速度稍微提高一点,但是程序自身却有可能变得臃肿

函数式宏在使用上必须小心谨慎。例如,sqr(a++)展开后((a++) * (a++))。每次展开,a的值都会自增两次。在不经意间表达式被执行了两次,导致程序出现预料之外的结果,我们称这种情况为宏的副作用(side effect)

在定义和使用函数式宏时,请仔细考虑是否会产生副作用。

函数版的sqr_int(a++)a的值不会递增两次,如果是宏版,则要将sqr(a)a++分开。

上一篇下一篇

猜你喜欢

热点阅读