do{…}while(0)在宏定义中的作用

最近在github上翻别人的代码来看。

看见某些宏定义中,使用了do{…}while(0)的形式,就很纳闷,这不是多此一举吗。然后搜索引擎查了一下,发现竟然是个很有用的东西。

如果我们这样子定义一个宏

#define func(x) func1(x);func2(x)

然后这样子调用

if(condition)
    func(a);

然后就会发现他变成了

if(condition)
    func1(a);
func2(a);

这样子就不是我们想要的方式了。

那外面加个大括号呢?例如

#define func(x) {func1(x);func2(x);}

也不行,会变成

if(condition)
{
    func1(a);
    func2(a);
};

所以为了让使用这段宏的其他人(如果只有我们自己当然无所谓),能准确无误地使用,能像个函数一样使用,在宏定义时可以使用do{…}while(0)的形式。

比如

#define func(x) do{func1(x);func2(x);}while(0)

展开后

if(condition)
do
{
    func1(a);
    func2(a);
}while(0);

这样子就没问题了

发表评论

电子邮件地址不会被公开。 必填项已用*标注