关于宏定义 do……while(0) 定义多条语句

为什么要用do……while(0)把宏定义的多条语句括起来?
答案:

这是一个奇怪的循环,它就只会运行一次,为什么不去掉外面的do{..}while结构呢?原来这也是非常巧妙的技巧。在工程中可能经常会引起麻烦,而上面的定义能够保证这些麻烦不会出现。下面是解释:

假设有这样一个宏定义

#define macro(condition) \

if(condition) dosomething()

现在在程序中这样使用这个宏:

if(temp)
    macro(i);
else
    doanotherthing();

一切看起来很正常,但是仔细想想。这个宏会展开成:

if(temp)
    if(condition) dosomething();
else
    doanotherthing();

这时的else不是与第一个if语句匹配,而是错误的与第二个if语句进行了匹配,编译通过了,但是运行的结果一定是错误的。

为了避免这个错误,我们使用do{….}while(0) 把它包裹起来,成为一个独立的语法单元,从而不会与上下文发生混淆。同时
因为绝大多数的编译器都能够识别do{…}while(0)这种无用的循环并进行优化,所以使用这种方法也不会导致程序的性能降低。

另一个讲解:

这是为了含多条语句的宏的通用性,因为默认规则是宏定义最后是不能加分号的,分号是在引用的时候加上的比如定义了一个宏fw(a,b),那么在c文件里一定是这样引用
fw(a,b);

如果不用do...while,那么fw就得定义成: 

#define fw(a,b) {read((a));write((b));}  
    那这样fw(a,b);展开后就成了:
    {read(a);write(b);};
    最后就多了个分号,这是语法错误,(注意的是:实际多数C编译器完全可以顺利通过编译,并且不影响结果,所以对于这种说法要辨证的看待

而定义成do...while的话,展开后就是:
    do{read(a);write(b);}while(0);  完全正确

几个典型的宏定义函数:

1)

#define nwkBusy() (nwkState != NWK_STATE_IDLE)

2)

#define nwkDoService() \
    a_nwk_service.status = LRWPAN_STATUS_NWK_INPROGRESS;\
    nwkState = NWK_STATE_COMMAND_START;\
    nwkFSM();
   3)
    #define conPrintROMString(s) \
    {\
     static  ROMCHAR xxxxromstr[] = s;\
     conPrintROMString_func(xxxxromstr);\
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值