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

您所在的位置:网站首页 宏程序语句表达式 C语言宏中的do{}while(0)和语句表达式

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

2024-07-12 07:49| 来源: 网络整理| 查看: 265

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

请看下面一段代码:

#include

#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;})



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3