函数式宏较之对象式宏可以进行更复杂的代换
虽然程序中没提到,但同样适用于long型和float型等数据类型。
函数和函数式宏的区别
1.函数式宏sqr是在编译时展开并填入程序的,因此只要是能用双目运算符进行乘法计算的数据类型,都能使用函数式宏。而函数定义则需为每一个形参定义各自的数据类型,返回值也只能式一种,函数较为严格
2函数默默无闻进行了一些复杂处理,而函数式宏所做工作只是宏展开和填入程序
3.函数式宏使用时必须小心谨慎,例如sqr(a++)则每次展开时,a的值都会自增两次。注意:在定义和使用函数式宏时,请仔细考虑是否会产生副作用。
函数式宏和对象宏 如上图 如果在宏名称sqr和(之间填入空格,就会被当作对象宏。
函数式宏也可以不带参数的
练习8-3(这是以int型的两值互换)
数值的交换,还是得引入别的变量。宏展开可以是语句,这里的while循环的0只是一次循环而已(小技巧)
下面介绍函数式宏使用方面的一个重要技巧.
第一个案例if语句会在第一个复合语句{}处结束,这时因为后面的分号会被视为空语句。编译器会认为"没有if,为何出现else“(即使如此也不能去掉宏定义的{})
接下来,就到了逗号运算符大显身手的时候了。
如第二个案例:由逗号运算符连接的两个表达式在语法上会被视为一个表达式(其实不仅限于逗号运算符,只要是由运算符连接的多个表达式,例如”a+b“,都可以视为一个表达式)
在表达式后面加上分号会形成表达式语句。
注意:如果宏定义中要代换两个以上的表达式,则使用逗号运算符连接,使其在语法上构成一个表达式。
对于使用逗号运算符的逗号表达式"a,b",会按顺序判断表达式a和b。对左侧的表达式a仅进行判断,判断结果会被省略。而对于右侧的表达式b进行判断所得到的类型和值,就是逗号表达式的类型和值
例如,i的值为3,j的值为5,若运行:x=++i,++j;
则i和j都会递增,递增后的j的值6会被赋给x