C语言宏中的do{}while(0)和语句表达式

C语言宏中的do{}while(0)和语句表达式

1. 宏中的do{}while(0)

请看下面一段代码:

#include <stdio.h>

#define swap(a, b)      {int t = a; a = b; b = t;}

int main(void)

{

    int x = 1;

    int y = 2;

    int z = 3;

   

    if (x > y)

        swap(x, y);

    else

        swap(y, z);

   

    printf("%d %d %d\n", x, y, z);

    return 0;

}

这段代码看着没有什么问题,但是编译的时候就会报错。这是因为在宏替换后   

    if (x > y)

        swap(x, y);

    else

        swap(y, z);

变为了:

    if (x > y)

        {int t = a; a = b; b = t;};

    else

        {int t = a; a = b; b = t;};

注意{ }后的分号; ,这使得编译器认为if就这样结束了,后面的else由于没有匹配的if,编译报错。如果每条if语句都带上{},那么这个问题就解决了,如下代码:

    if (x > y)

    {

        swap(x, y);

    }

    else

    {

        swap(y, z);

    }

但是这并不能解决问题的实质。因此,有人想出了用do{}while(0)解决这个问题。

#define swap(a, b)      do {int t = a; a = b; b = t;} while (0)

有没有其他的方法呢,其实还有一种比较好的方法,就是GUN C中有的语句表达式。

2. 语句表达式

GUN C把包含在括号中的复合语句看成是一个表达式,称为语句表达式,它可以出现在任何允许表达式的地方。我们可以在语句表达式中使用原本只能在复合语句中使用的循环、局部变量等。例如:

#define min(x, y) ({                \

       const typeof(x) _x = (x);         \

       const typeof(y) _y = (y);         \

       (void) (&_x == &_y);           \

       _x < _y ? _x : _y; })

代码行(void) (&_x == &_y)的作用是可以检查_x和_y的类型是否一致。

可以用这种方法解决上面出现的问题,即把宏改成如下形式:

#define  swap(a, b)      ({int  t = a;  a = b;  b = t;})

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值