do{} while(0)

来源:互联网 发布:查看网络攻击的网站 编辑:程序博客网 时间:2024/06/02 21:59

在C语言中,偶尔会看到do{}while(0)这样的语句。 其实这样的句法更多的是在 Linux 内核中,而且主要是用于宏定义中。

举例说明:

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

假设这里去掉 do…while(0),即定义 SAFE_DELETE 为:
#define SAFE_FREE(p) free(p); p = NULL;
那么以下代码:
if(NULL != p)
SAFE_DELETE(p)
else
...//do something 

会被展开为:
if(NULL != p)
free(p); p = NULL;
else

...//do something
展开的代码中存在两个问题:
(1)if 分支后有两个语句,导致 else 分支没有对应的 if,编译失败;
(2)假设没有 else 分支,则 SAFE_FREE 中的第二个语句无论 if 测试是否通过都
会执行。
将 SAFE_FREE 的定义加上{}就可以解决上述问题了,即:
#define SAFE_FREE(p) { free(p); p = NULL;}
这样,代码

if(NULL != p)
SAFE_DELETE(p)
else
...//do something
会被展开为:
if(NULL != p)
{ free(p); p = NULL; }
else
...//do something
但是,在 C 程序中,每个语句后面加分号是一种约定俗成的习惯,那么,如下代
码:
if(NULL != p)
SAFE_DELETE(p);
else
...//do something
将被扩展为:
if(NULL != p)
{ free(p); p = NULL; };
else
...//do something
这样,else 分支就又没有对应的 if 了,编译将无法通过。假设用了 do{}while(0),
情况就不一样了,同样的代码会被展开为:
if(NULL != p)
do{ free(p); p = NULL;} while(0);
else
...//do something
不会再出现编译问题。 do{}while(0)的使用完全是为了保证宏定义的使用者能无编
译错误地使用宏,它不对其使用者做任何假设。












摘录自《Linux设备驱动开发详解》 3.5.3小节,原书作者:宋宝华老师。

如有侵权,或者不当,请及时与我联系,我定会立即处理。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 喝了受潮的奶粉怎么办 刚买的奶粉受潮怎么办 羊不小心吃了化肥怎么办 阿胶粉结成块了怎么办 半桶奶粉受潮了怎么办 眉粉受潮了结块怎么办 刚买的奶粉结块怎么办 袋装白糖成坨了怎么办 一袋子白糖硬了怎么办 粉饼上有一层油怎么办 葡萄后期氮肥施用过多怎么办 没洗的菜吃了怎么办 闻了汽油味头晕怎么办 碰到绿萝的汁液怎么办 吃了带农药水果怎么办 开槽模切一体机模切时开槽怎么办 柔版印刷走纸歪斜怎么办 美团外卖一天8单怎么办 单位显示器丢了怎么办员工赔 纸板板门起泡了怎么办 卖家要我开出质量问题证明怎么办 闲鱼买到的商品不符合描述怎么办 寄出去的东西碎了怎么办 闲鱼快递损坏了怎么办 寄快递东西坏了怎么办 快递邮寄东西坏了怎么办 快递被别人拆了怎么办 淘宝买的东西包装破损怎么办 寄血液被退回来怎么办 快递被安检扣了怎么办 淘宝原单退回运费怎么办 运输过程中包裹破损怎么办 天猫没收到货签收怎么办 收到的快递坏了怎么办 自寄的快递少了怎么办 邮的东西弄坏了怎么办 物流签收后发现货物损坏怎么办 发现客人损坏了酒店物品怎么办 东西坏了签收了怎么办 朋友圈贩卖三无产品你怎么办 付钱给微商没有保障怎么办