| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1689 人关注过本帖
标题:请教do{}while(0)的一些疑问
只看楼主 加入收藏
墨道
Rank: 2
等 级:论坛游民
帖 子:4
专家分:20
注 册:2011-7-14
收藏
 问题点数:0 回复次数:4 
请教do{}while(0)的一些疑问
在sunplus的源代码中,有这么一个宏定义:#define OSD1000ISP_STATUS(stat, ir)   do{}while(0)

概括来说
在A.h文件中定义
#define OSD1000ISP_STATUS(stat, ir)   do{}while(0)

在B.c文件中调用
OSD1000ISP_STATUS(OSDISP_REP_IDLE, OSDIR_REPEAT);

请问这个宏定义什么用?比如上面那个B.c文件中调用是具体这么执行?我看do{}while(0)
这个do{}大括号里面什么都没有,难道什么都不执行吗?要是什么都不执行的话这个宏定义有啥意思,以及调用时OSD1000ISP_STATUS(OSDISP_REP_IDLE, OSDIR_REPEAT);括号里面的参数有啥意思?

请教各位,谢谢。
文章出处:LCDHOME论坛网WWW. 原文地址:http://bbs.
搜索更多相关主题的帖子: 源代码 大括号 while 
2011-09-20 22:52
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
转载:
如果你是C++程序员,我有理由相信你用过,或者接触过,至少听说过MFC, 在MFC的afx.h文件里面, 你会发现很多宏定义都是用了do...while(0)或do...while(false), 比如说:
#define AFXASSUME(cond)       do { bool __afx_condVal=!!(cond); ASSERT(__afx_condVal); __analysis_assume(__afx_condVal); } while(0)
粗看我们就会觉得很奇怪,既然循环里面只执行了一次,我要这个看似多余的do...while(0)有什么意义呢?
当然有!
为了看起来更清晰,这里用一个简单点的宏来演示:
#define SAFE_DELETE(p) do{ delete p; p = NULL} while(0)
假设这里去掉do...while(0),
#define SAFE_DELETE(p) delete p; p = NULL;
那么以下代码:
if(NULL != p) SAFE_DELETE(p)
else   ...do sth...
就有两个问题,
1) 因为if分支后有两个语句,else分支没有对应的if,编译失败
2) 假设没有else, SAFE_DELETE中的第二个语句无论if测试是否通过,会永远执行。
你可能发现,为了避免这两个问题,我不一定要用这个令人费解的do...while,  我直接用{}括起来就可以了
#define SAFE_DELETE(p) { delete p; p = NULL;}
的确,这样的话上面的问题是不存在了,但是我想对于C++程序员来讲,在每个语句后面加分号是一种约定俗成的习惯,这样的话,以下代码:
if(NULL != p) SAFE_DELETE(p);
else   ...do sth...
其else分支就无法通过编译了(原因同上),所以采用do...while(0)是做好的选择了。
也许你会说,我们代码的习惯是在每个判断后面加上{}, 就不会有这种问题了,也就不需要do...while了,如:
if(...)
{
}
else
{
}
诚然,这是一个好的,应该提倡的编程习惯,但一般这样的宏都是作为library的一部分出现的,而对于一个library的作者,他所要做的就是让其库具有通用性,强壮性,因此他不能有任何对库的使用者的假设,如其编码规范,技术水平等。


总有那身价贱的人给作业贴回复完整的代码
2011-09-20 23:40
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
没有任何使用价值..

我就是真命天子,顺我者生,逆我者死!
2011-09-20 23:45
墨道
Rank: 2
等 级:论坛游民
帖 子:4
专家分:20
注 册:2011-7-14
收藏
得分:0 
回复 2楼 embed_xuel
谢谢你的热心回复,但是,你看到没有,我的那个do{}while(0),这个do{}大括号里面啥都没有啊,什么都不做?你转载的那个我也百度找到了。之所以还来论坛求助,那时因为你转载的那个并没有解答我的疑问。
继续坐等高手、热心人。
2011-09-21 19:57
jinxino_o
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2015-11-26
收藏
得分:0 
回复 楼主 墨道
内核中由于不同架构的限制,很多时候会用到空宏,在编译的时候,空宏会给出warning
为了避免这样的warning,就可以使用do{}while(0)来定义空宏

你可以直接当成一个空宏忽略掉就行了
2015-11-26 16:15
快速回复:请教do{}while(0)的一些疑问
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.037196 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved