do while

do {} while(0) 经常用在宏的定义中。这就是C语言的一个常见的用法,简称惯用法。任何一门语言都会有若干惯用法,有“经验”的程序员是应当知悉这些惯用法的。

除了惯用法,还有模式,这是更高层次的经验积累。当遇到一个“问题”,要知道这个问题并不是“新问题”,而是在若干年前都被无数人解决过多次。前辈们把这些已经解决过的问题进行了分类、提炼,就形成了若干模式。

在模式的基础之上,还可以形成架构,这就是基于模式的架构。一个程序员如果要具有驾驭“大系统”的能力,需要知悉若干常用的架构。

好了,不扯远了,下面具体说一下 do {}while (0)这种惯用法。




将 do {} while (0) 用在宏里面是最恰当不过的了。

假设某一宏的定义如下:

#define TEST_MACRO(a, b, c) /
    a = c; b = c;
当程序这样来使用宏时:

if (condition)
    TEST_MACRO(a, b, c);
宏被替换后就变成了:

if (condition)
    a = c;
b = c;
显然,这与原来的意图相悖。很容易我们就通过更改以上的宏定义将其加上 {} 来达到目的。但这样也是不可取的。如:


#define TEST_MACRO(a, b, c) /
    {a = c; b = c;}

if (condition)
    TEST_MACRO(a, b, c);
else
    do_something_else();
宏展开后:

if (condition)
{
    a = c;
    b = c;
}
; /* <--- here !!! */
else
    do_something_else();
我想您已经看出来这里面的原因了。编译器是不会放过你的。

但,如果利用 do {} while(0) 定义的话,这些都可以避免了。

#define TEST_MACRO(a, b, c) /
    do { a = c; b = c; } while(0)

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值