c语言中的带参宏定义

  1. C语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数,这点和函数有些类似。

  2. 对带参数的宏,宏展开和用实参替代形参,发生在预处理阶段。

  3. 示例1:

    1. #define SUM(x, y) x+x*y+y // 定义宏

    2. 10 * SUM(2+2, 3+3) 

      1. 预期结果为:10 * (4 + 4 * 6 + 6) = 340

      2. 实际结果为:10 * 2 + 2 + 2 + 2 * 3 + 3 +3 + 3 = 39

      3. 修改后的宏定义:#define SUM(x, y) ((x) + (x) * (y) + (y))

        1. 修改的内容:

          1. 每个形参在宏定义字符串中都需要由小括号括起来。原因:宏展开时,不对实参表达式做任何计算。即SUM(2+2, 3+3) !=SUM(4, 6)。

          2. 将宏定义的整个字符串包含在括号中。

  4. 示例2:使用宏定义,交换两个参数的值。

    1. 方法一:使用异或运算。

      1. 方式1:

        1. 定义:#define SWAP(a, b) (a = a^b, b = a^b, a = a^b) // 该宏定义为逗号表达式。

        2. 调用:SWAP(a, b); // 宏调用后需加分号。因为逗号表达式不是可执行的语句。

      2. 方式2:

        1. 定义:#define SWAP(a, b) {a = a^b; b = a^b; a = a^b;} // 该宏定义为三条语句构成的语句块。

        2. 调用:SWAP(a, b) // 宏调用后不需要加分号。加了分号也不会有错误,仅表示在宏展开的三条语句执行完成后,执行了一条空语句。

    2. 方法二:在宏定义中定义临时变量。

      1. #define SWAP(x, y) {int tmp; tmp = a; a = b; b = tmp;}

      2. 注意:宏定义字符串中包含大括号,且在使用SWAP时不需要添加额外的分号:

        1. int a = 1, b = 2;

        2. SWAP(a, b) // 注意没有分号。

  5. 可变参数宏:#define PINFO(fmt, args...)    printf(fmt, ##args)

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值