宏定义为何使用do-while语句

宏定义为何使用do-while语句

最近在阅读开源代码的过程中,发现宏定义中大量使用了do-while语句。有时感觉这是不是多此一举呢。于是去网上查阅资料就有了本篇博客。

最近看到的代码中的宏定义结构如下:

#define MARCO_FUN() 		do{\
Function();\
}while(0)

第一次看心想直接#define MARCO_FUN Function()不就可以,后来想一想可能是为了确定独立的代码块,避免和外部的代码语义混淆。毕竟宏的本质就是预编译时的简单替换。


下面进行总结下do-while用于宏的作用:

  • 空的宏定义避免warning
#define foo() do{}while(0)
  • 存在一个独立的block,可以用来进行变量定义,进行比较复杂的实现
#define MARCO_FUN() 		do{\
Function01();\
Function02();\
...
}while(0)
  • 如果出现在判断语句中的宏可以保证是作为一个整体来处理的
#define foo(x) \
Function01();\
Function02();
//这种情况下会出现Function01和Function02不会同时被执行的情况,而这显然不是程序设计的目的
if(nullptr != pPointer)
	foo();
  • 上面一种情况用单独的{}的实现,但是为什么一定要用do{}while(0),在把宏引入代码中,会多出一个分号,从而会报错。看下面代码:
#define	swap(x,y) {int tmp; tmp=x;x=y;y=tmp;}

if(x>y)
	swap(x,y);
else       //error, parse error before else
	otheroperator();

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

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Erice_s

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值