8-1 函数式宏

函数式宏较之对象式宏可以进行更复杂的代换

虽然程序中没提到,但同样适用于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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值