使用do{ } while(0);有什么好处???

西热力江 2013-01-31 10:35:58
_Api()
{
do
{
//do something
}while(0);
}

这样写的有什么好处啊?????
...全文
4432 56 打赏 收藏 转发到动态 举报
写回复
用AI写文章
56 条回复
切换为时间正序
请发表友善的回复…
发表回复
千树之影 2013-02-18
  • 打赏
  • 举报
回复
引用 53 楼 yellow_hill 的回复:
引用 52 楼 baipv008 的回复: 引用 43 楼 yellow_hill 的回复:好吧,如果非要linux kernel来参考: linux-2.6.34\kernel\rcutree.h C/C++ code ? 12345678910111213141516171819202122232425 /* * Scan the leaves of th……
用for还真实现不了。 do{}while(0)的特点是后面加不加分号都只算一条语句。 for(){}后面再加分号就是两条语句了。
Franklin 2013-02-07
  • 打赏
  • 举报
回复
引用 52 楼 baipv008 的回复:
引用 43 楼 yellow_hill 的回复:好吧,如果非要linux kernel来参考: linux-2.6.34\kernel\rcutree.h C/C++ code ? 12345678910111213141516171819202122232425 /* * Scan the leaves of the rcu_node……
当然,他显然比{}要好用了,它可以break,但是{}不可以。所以说和{}一样倒真的错了
Franklin 2013-02-07
  • 打赏
  • 举报
回复
引用 52 楼 baipv008 的回复:
引用 43 楼 yellow_hill 的回复:好吧,如果非要linux kernel来参考: linux-2.6.34\kernel\rcutree.h C/C++ code ? 12345678910111213141516171819202122232425 /* * Scan the leaves of the rcu_node……
我没说这个是循环,只是说这个东西的功能,for就可以实现了,没有什么特别的好处,当然也没有啥本质区别 有什么本质区别呢? for也可以实现执行一次
千树之影 2013-02-06
  • 打赏
  • 举报
回复
引用 43 楼 yellow_hill 的回复:
好吧,如果非要linux kernel来参考: linux-2.6.34\kernel\rcutree.h C/C++ code ? 12345678910111213141516171819202122232425 /* * Scan the leaves of the rcu_node hierarchy for the specified rcu_stat……
你完全理解错了,do while(0)不是循环,只执行一遍!他的目的和直接加大括号一样。用while只不过是使这个宏可以用于if等分支里。 所以do while(0)和while(1){},for这些有本质区别。
Panda_熊猫 2013-02-04
  • 打赏
  • 举报
回复
25楼,说的好。
yulitingfeng 2013-02-02
  • 打赏
  • 举报
回复
支持24楼说法。
mymtom 2013-02-02
  • 打赏
  • 举报
回复
支持24楼,据我所看到的正式发布的软件源代码, do { /* ... */ while (0) 都是用在宏定义中。
BeanJoy 2013-02-01
  • 打赏
  • 举报
回复
引用 24 楼 yangwenjun2017 的回复:
为了宏展开的时候不会出错。 如过直接放在花括号会出错的,不如 C/C++ code?1#define DO_SOMETHING {int time = 100 ;make_love(i);} 下面是使用的地方 C/C++ code?12if(you->strong())DO_SOMETHING;else ..; 展开后是这样的 C/C++ code?1234i……
引用 25 楼 zhaokai115 的回复:
8楼和24楼分别说了do...while(0)的两个不同应用。特别是在含多条语句的宏里面用得比较多 假如啊a, b分别是两条C语句,定义一个顺序执行他们的宏有几种写法,比如 C/C++ code?1234#define AB1 a; b; // x, 下面语句b不能被执行: if (cond) AB1;#define AB2 { a; b; } /……
拜托,虽然你俩说的对,宏中应该用{}包含起来,但这与楼主的问题有什么关系?
Franklin 2013-02-01
  • 打赏
  • 举报
回复
}while(0); //这里保证仅仅执行一次 仅此而已,其他有什么好处? break,while(1){}; switch case;for 都可啊 我觉得用for的更好,还可以continue,所以总结来说,没什么好处。。。
临风听雪 2013-02-01
  • 打赏
  • 举报
回复
引用 24 楼 yangwenjun2017 的回复:
为了宏展开的时候不会出错。 如过直接放在花括号会出错的,不如 C/C++ code?1#define DO_SOMETHING {int time = 100 ;make_love(i);} 下面是使用的地方 C/C++ code?12if(you->strong())DO_SOMETHING;else ..; 展开后是这样的 C/C++ code?1234i……
赞同这个。。
aspnet_2012 2013-02-01
  • 打赏
  • 举报
回复
引用 8 楼 falcomavin 的回复:
当你执行一段代码到一半,想跳过剩下的一半的时候,如果你正处于do while循环中,则能用break达到这个目的。如: do { 我执行 我执行。。 我再执行。。。 if (有什么条件满足了我) { 呀,我想跳到另外一段代码了,剩下的不执行了,可是不建议用goto语句,怎么办呢? break;/*看我的*/ }……
李师师
wizard_tiger 2013-02-01
  • 打赏
  • 举报
回复
个人认为8楼正解。
siasjack 2013-02-01
  • 打赏
  • 举报
回复
8楼解释是最好的!
banks0913 2013-02-01
  • 打赏
  • 举报
回复
25楼正解。linux内核和驱动里这种用法很常见
  • 打赏
  • 举报
回复
我经常这么用

if(...)
{
  do sth...
  if(...)
  {
    do sth...
    if(...)
    {
     do sth...
     }
    else
    {
      return -3;
    }
  }
}

int nRet = 0;
do
{
  if(!...)
  { 
    nRet = -1;
    break; 
  }
   do sth...
  if(!...)
  { break; }
  do sth...
  if(!...)
  { break; }
  do sth...
  nRet = 0;
}while(0);

return nRet;
zhuyf87 2013-02-01
  • 打赏
  • 举报
回复
觉得3、6、7、8、13、24楼说的比较靠谱些。^_^
xiaoxiaokun888 2013-02-01
  • 打赏
  • 举报
回复
关键在于while(0)这个东西,我在写宏涉及到if语句的时候常用; 有时候他就相当于{},但是语句后面都要加;的,{};好像没有这么干地
七神之光 2013-02-01
  • 打赏
  • 举报
回复
昨天看到宏定义里面大量使用这种技巧
老王爱上猫 2013-02-01
  • 打赏
  • 举报
回复
8楼 8楼...
linxren 2013-02-01
  • 打赏
  • 举报
回复
可以break, 后面可以有;号
加载更多回复(33)

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧