QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1069|回复: 5

为何用while(0)

[复制链接]
发表于 2005-7-27 10:17:18 | 显示全部楼层 |阅读模式
看到一些代码里喜欢这样用 不知何故?
do { if (debug) printk(KERN_DEBUG __FILE__ ": " format "\n" , ## arg); } while (0)
发表于 2005-7-27 10:31:54 | 显示全部楼层
就是方便的和if什么的组装。

例如里面有多条语句的时候。

编译时编译器会自动把while(0)给拆掉。
回复

使用道具 举报

 楼主| 发表于 2005-7-27 10:41:30 | 显示全部楼层
哪为啥不这样用:
{ if (debug) printk(KERN_DEBUG __FILE__ ": " format "\n" , ## arg); }
回复

使用道具 举报

发表于 2005-7-27 10:46:58 | 显示全部楼层
[code:1]
#define aaa_fun(debug) \
{ if (debug) printk(KERN_DEBUG __FILE__ ": " format "\n" , ## arg); }

if(...)
  aaa_func(debug)[b];[/b]
else
  ....;

[/code:1]

编译错误。
回复

使用道具 举报

发表于 2005-7-27 18:28:44 | 显示全部楼层
在内核源代码里很多的
回复

使用道具 举报

发表于 2006-5-31 19:50:14 | 显示全部楼层
<< 代码阅读方法与实践>> 这本书说了为什么.

3楼的宏扩长后会多一个分号.
if(...)
  aaa_func(debug);
else
  ....;

使用1楼和3楼的分别是:
1楼:
if(...)
  do
{ if (debug) printk(KERN_DEBUG __FILE__ ": " format "\n" , ## arg); }
while (0);
else
  ....;

3楼:
if(...)
{
if (debug) printk(KERN_DEBUG __FILE__ ": " format "\n" , ## arg);
};
else
  ....;

正如5楼的,内核里面很多
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-2 14:20 , Processed in 0.037458 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表