当前位置:  技术问答>linux和unix

询问一下,这里为什么用do{}while(0),不用应该也可以的吧。

    来源: 互联网  发布时间:2017-01-04

    本文导语:  询问一下,这里为什么用do{}while(0),不用应该也可以的吧。如下,为什么? #define wr_regl(port, reg, val)    do { __raw_writel(val, portaddr(port, reg)); } while(0) | 我举两个反例,你就知道为什么了。 ...

询问一下,这里为什么用do{}while(0),不用应该也可以的吧。如下,为什么?
#define wr_regl(port, reg, val) 
  do { __raw_writel(val, portaddr(port, reg)); } while(0)

|
我举两个反例,你就知道为什么了。

抛开你的例子不谈,你的例子无法证明其中一种反例,我举一个全面的:

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

调func会调用func1和func2.

如下语句:

if(...)
   func();

替换后:

if(...)
   func1();
   func2();
其实这样写只会执行func1(),违背了你的意愿。

面临上边这种问题,你决定修改宏为:

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

现在是一个语句块,于是你觉得万事大吉了。

if(...)
   func();
else
   ...;

替换后位:

if(...)
   {func1();func2()};
else
   ...;

多了一个分号,ifelse直接被破坏,找不到else。

你会辩解,我肯定会这样写程序:
if(...)
   {func();}
else
   ...;

这样的确没错,但很多程序员喜欢在If只有一条语句的时候不写{}。

为了解决这两个问题,说白了就是让宏成为一个语句块,而且宏之后可以写分号。

那么用dowhile最好了。

if(...)
   func();

if(...)
{func();}

都不会有问题。

|
这个写法主要是为了解决宏展开为多行的问题,
对这一句来说,不用也可以。

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 通过jsp打开word文件,怎样去掉打开前的询问框?
  • VI编辑器有逐个询问替换的功能吗?
  • 询问下,SOLARIS10下如何通过命令行修改时区,多谢各位!
  • 散分,上午过的SCJP, 询问各位同人SCJD的情况。
  • 询问学习方向
  • 询问关于JAVA类库的问题
  • 讨论:询问上海的IT行情
  • 有个较笨问题询问高手
  • 询问一个proftp的问题
  • 询问gcc的一个编译选项
  • 菜鸟询问关于Unix版本的问题
  • 菜鸟询问Vmware配置问题
  • Linux备份方案询问
  • 请教毕业设计相关题目询问各位高手。。
  • 开发工具询问
  • 未装samba却可以访问windows网络,询问其访问机制
  • 菜鸟询问:学习linux主要的方向?
  • 询问 mount --bind 问题
  • 驱动询问!
  • 询问一个TCPDUMP语法问题 在抓TCP包时不能指定IP吗?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3