当前位置: 技术问答>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 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();}
都不会有问题。
抛开你的例子不谈,你的例子无法证明其中一种反例,我举一个全面的:
#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.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。