深度理解do{} while(0)语句的作用

物联网、智能家居 专栏收录该内容
392 篇文章 29 订阅

                                             深度理解do{} while(0)

 

在linux内核中常常会看到do{} while(0)这样的语句,有人疑惑,认为无意义,因为他只执行一次,加不加do{} while(0)小过失完全一样的,那你就错了,没有完全了解do{} while(0)。下面看一个例子:

定义一个宏:

#define SAFE_FREE(p)  do{free(p); p=NULL}  while(0)

假设这里去掉do{....} while(0),及定义为:

#define SAFE_FREE(p)  free(p); p=NULL;

那么一下代码

If(NULL!=p)

   SAFE_FREE(p)

else

   .......

会被展开成:

If(NULL!=p)

   free(p); p=NULL;

else

   .......

 

展开存在两个问题:

  1. 因为if分支后面有两个语句,导致else分支没有对应的if,编译失败。
  2. 假设没有else分支,则SAFE_FREE中的第二个语句无论if测试是否通过,都会执行。

如何解决以上问题呢?

有人说给SAFE_FREE的定义加上{}就可以解决上述问题了,即:

#define SAFE_FREE(p)  { free(p); p=NULL; }

代码展开如下:

If(NULL!=p)

   { free(p); p=NULL; }

else

   .......

 

但是,在C程序中,每个语句后面加分号是一种约定俗成的习惯,那么代码如下:

If(NULL!=p)

   { free(p); p=NULL; };

else

   .......

 

问题又来了,这样else又没有对应的if了,编译还是失败。假设用了do{} while(0)就可以解决上面的一系列问题了,代码如下:

If(NULL!=p)

  do { free(p); p=NULL; } while(0);

else

   .......

所以do {} while(0)的使用时为了保证宏定义的使用者能无编译错误的用宏。

 

 

 

 

相关推荐
©️2020 CSDN 皮肤主题: 成长之路 设计师:Amelia_0503 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值