`
阅读更多
从一些经典代码中常常看到宏中使用do...while(0)的用法,感觉上do...while(0)只是在有可能要中途跳出后续一段代码的时候替换goto的一种用法,其他的就不求甚解了。

今天总算看到了wiki上对do...while(0)的解释,算是解了心中的一个疑惑。

一种情况是,这种用法可以避免在if/for下使用宏时,由于宏中的多个语句遗漏大括号而造成流程错误。就像下面这一段代码,可算是个明显的错误了。

  #define DO_SOMETHING()  DO_A();\
        DO_B();  \
        DO_C()
   
//

    if (CONDITION_A)
        DO_SOMETHING();


要是使用do...while(0)DO_SOMETHING()宏改成这样,就可以避免上述的错误了。

    #define DO_SOMETHING() do{ \
        DO_A(); \
        DO_B(); \
        DO_C(); \
    }
while(0)

这可就有一个疑问了,何必加上do...while(0)呢,直接使用大括号不就好了么?

不错,只要在宏中使用大括号就可以把多条语句合成一条语句了。不过,大括号并不是个天山雪莲般可治百病的灵药哟。

看看直接使用大括号的程序吧。

    #define DO_SOMETHING() {\
        DO_A();  \
        DO_B();  \
        DO_C();  \
    }

   
//

   
if (CONDITION_A())
        DO_SOMETHING();
   
else
        DO_SOMETHING_ELSE();

看出问题了么?由于if语句下的宏后多的那个小小的分号,if下的一个语句就变成了两个语句,随后的else可就会提示你语法错误喽

而使用之前do...while(0)的宏就不会有这个问题,这也就是do...while(0)的第二个用处了。

当然,以上说的这些都是一种无奈的保护机制。如果保持一个良好的编程习惯,比如在if和else后面紧跟大括号,就不需要在乎宏上的do...while(0)了。

只是,可惜的是,当我把do...while(0)使用到公司的代码中时,却发现这触犯了Lint工具的检测规范,而直接给了我违规的结论。无奈之下,只得把do...while(0)全部删除。

或许,Lint工具并不是告诉我这样做违反编程规范,只是想提醒我要养成良好的遵守编程习惯吧
分享到:
评论

相关推荐

    淘宝违规处罚考试节手机类目下,商品发布信息合理的是.doc

    淘宝违规处罚考试节手机类目下,商品发布信息合理的是.doc

    卡洛西尔效应在后牛顿重力作用下的洛仑兹违规

    此外,通过对$$ \ varepsilon $$ε的分析,我们推测了违反Lorentz的术语$$ {\ bar {s}} ^ {\,00} $$s¯00的合理约束, 此数量当前可用的界限。 最后,我们指出,我们的结果具有内在的有效性,超出了点状引力源的...

    课程设计抢答器的设计与应用

    (3) 具有违规显示功能,并显示违规抢答者代码 设计要求: 1 .分析设计要求,明确性能指标。必须仔细分析课题要求、性能、指标及应用环境等,广开思路,构思出各种总体方案,绘制结构框图。 2 .确定合理的总体方案。...

    CAD专用观看工具2004-2009都行

    如果发现违规资源进行积极举报.经我们确认后可以得到50分. (3)可以对CSDN下载社区提些合理的建议及意见.经过采纳可以得到100分. 值得注意的是如果您的分一旦成为正分,下载资源时要记得对资源进行合理的评分。这样...

    基于SSM的抑抑心理交流平台.zip

    5 用户针对其他不当言论可对其作品或用户进行投诉,管理员审核,确认违规进行处理,若投诉位违规,则投诉无效,处理结果反馈到投诉者与被投诉者的个人中心 医生 1 医生注册之后需要提供其相关的证件,资格信息,由...

    基于SSM抑抑心理交流平台设计与实现

    5 用户针对其他不当言论可对其作品或用户进行投诉,管理员审核,确认违规进行处理,若投诉位违规,则投诉无效,处理结果反馈到投诉者与被投诉者的个人中心   医生 1 医生注册之后需要提供其相关的证件,资格信息,...

    java项目之抑抑心理交流平台(源码+说明文档).zip

    5 用户针对其他不当言论可对其作品或用户进行投诉,管理员审核,确认违规进行处理,若投诉位违规,则投诉无效,处理结果反馈到投诉者与被投诉者的个人中心 医生 1 医生注册之后需要提供其相关的证件,资格信息,由...

    使用法医学实验室样本流入数据分析亚组大小对X-bar控制图的影响

    对于不同的控制图规则,随着k的增加,失控点或违规数量Nocp的变化被确定为遵循衰减指数函数Nocp = Ae–α,为此,拟合优度得到确定,而R2值仅对规则#4和#5接近统一。 拟合优度已被确定为是合理的亚组规模范围的新...

    [计算机Java毕业设计]ssm框架基于JavaWeb的学生宿舍管理系统设计与实现+jsp+程序源代码+论文.rar

    2. 宿舍分配管理:根据学生的需求和实际情况,合理分配宿舍资源,提高宿舍利用率。 3. 水电管理:实时监控宿舍水电使用情况,提醒学生及时充值缴费,避免因欠费导致的不便。 4. 报修服务管理:学生可通过系统提交...

    论文研究-基于页面聚类的Web应用测试方法研究.pdf

    现有的Web测试是由前端出发,通过分析页面DOM结构来获取状态与状态...实验结果表明:该方法可以有效地降低“单一DOM对应单一状态”模式中的冗余状态跳转,可以达到合理的功能发现率,同时有效降低冗余的待测试状态。

    论文研究-基于TC-Net的工作流模型研究.pdf

    时间要素作为工作流管理的重要部分,是...应用TC-Net模型进行实例分析,实验结果表明该工作流建模方法对时间违反而导致违规操作具有高敏感性,解决了单个任务违规和流程周期不合理两类问题,实现业务过程的管理和监控。

    A毕业设计:python+mysql的学生宿舍管理系统.zip

    学生宿舍管理系统是用于管理学生宿舍相关信息和日常运营的软件系统,通常由学校、大学或其他学生宿舍管理机构使用。该系统旨在帮助管理人员有效地安排学生宿舍住宿,提高宿舍资源利用率,以及提供学生舒适安全的居住...

    中微子物理学的扭曲风味对称性预测

    原则上,通过合理选择整体质量参数可以解释质量层次,而费米子混合角则受黄素场破坏的Δ(27)风味对称性的限制,后者对中微子混合参数给出了严格的预测, 和Dirac CP违规阶段,均仅以领先的两个独立参数来描述。...

    基于Java EE的停车场管理系统.zip

    如今,我国现代化发展迅速,人口比例急剧上升,在一些大型的商场,显得就格外拥挤,私家车的数量越来越多,商场停车难得问题凸显,对于停车场的合理利用有助于缓解用户停车压力,鉴于这样的背景;初步设定系统功能...

    基于JAVAEE的停车场管理系统

    如今,我国现代化发展迅速,人口比例急剧上升,在一些大型的商场,显得就格外拥挤,私家车的数量越来越多,商场停车难得问题凸显,对于停车场的合理利用有助于缓解用户停车压力,鉴于这样的背景;初步设定系统功能...

    一张表看懂员工持股计划与股权激励的区别.doc

    参与对象范围 董事、高级管理人员、核心技术(业务)人员,如对上诉以外人员成为激励对象的,上市公司应在股权激励计划备案材料中逐一分析其与上市公司业务或业绩的关联程度,说明其作为激励对象的合理性 ...

    中国各省存贷款余额(2003-2020年)

    余额可以反映银行对资金的利用情况,如果余额过多,说明资金没有得到合理的运用。贷款 数额是指借款人与放款人签订的合同数额,是一个不变的数额。贷款总额是指截止到某一日 以前商业银行已经发放的贷款总和,是企业...

    基于微信小程序的图书馆座位再利用系统(lw).zip

    5. **违规记录与处罚**:对于违反座位使用规则的行为,系统记录违规信息,并根据图书馆规定进行相应处罚,维护座位使用秩序。 6. **座位导航**:提供座位导航功能,帮助读者快速找到自己预约的座位,提高图书馆的...

    数学建模论文饮酒驾车模型

    竞赛获奖论文,懂得都懂。 交通事故是目前危害人类生命的第一杀手,而酒后驾车已经成为引发交通事故的重要原因之一,并日益凸现为社会问题,因此必须加强有效...最后对相关问题进行了解答,结果表明,模型是合理和有效的。

    gpl承诺

    Salesforce的GPL合作承诺在提出或继续起诉因涵盖许可的终止而引起的任何法律程序或索赔(防御性诉讼除外)之前,Salesforce承诺将被指控违反以下涵盖许可的个人或实体(“您”)扩大以下规定:固化和恢复,取自GPL...

Global site tag (gtag.js) - Google Analytics