`
RednaxelaFX
  • 浏览: 3052926 次
  • 性别: Icon_minigender_1
  • 来自: 海外
社区版块
存档分类
最新评论

又是宏……do..while(0)的用法

    博客分类:
  • C++
阅读更多
真是的,我用C++还是太少了。这个宏以前明明见过的,但其存在的意义突然就想不起来了。刚才问了下axx大才又“知道”了一次。赶紧记下来。

这样的宏见过么:
#define FOO(x) do {\
    some_code_line_1;\
    some_code_line_2;\
} while (0)

(注意while(0)后面没有分号)

乍一看这个宏不过就是定义了个包含多个语句的local scope,用do..while(0)包围起来简直多此一举。直接这样不就好了么:
#define FOO(x) {\
    some_code_line_1;\
    some_code_line_2;\
}


但问题是这两者不等价……

关键问题是前者定义出来的宏是一个非复合语句,而后者是一个复合语句。C/C++里有些语法结构对复合/非复合语句之间的区别是敏感的,例如说:
if ( someCond )
    FOO(x);
else
    //...

要是FOO(x)展开后是一个复合语句,那么FOO(x)后面的分号“;”就会终结整个if语句,导致else子句孤立而出现编译错误。
所以关键是那个while(0)后面不加分号。如果加了分号的话就没意义了。

如果用复合语句版本的宏,就要记得不写那个分号:
if ( someCond )
    FOO(x)
else
    //...

但是这样与一般的函数调用风格不统一,所以很多人倾向于使用do..while(0)这个trick来把local scope包起来而不是直接用复合语句({..})。

印象中这类的宏还有一个变种,
#define FOO(x) switch(0) default: ...

还是怎样的。具体是怎么写的忘记了……以后想起来的话一定得记下来 T T
分享到:
评论
1 楼 lwwin 2008-05-04  
当时偶们问这个问题的时候,老大们的解释是C++对象的释放,而且不需要使用GOTO,直接一个break就可以了……流程上也简单些-
另外就是FX大说得了-v-+ 好神奇的用法

PS:最近看打一个GCC的特性用法比如可变参数的宏,这个很有趣啊……
可是VC都不认得- -

相关推荐

    外研版九年级上册各单元重点短语、句型、语法全归纳.doc

    是……的时候了。"用于时间点的强调。"Is there anything special...? ……有什么特别的事情吗?"询问特殊事件,"teach sb how to do... 教某人怎样做……"涉及教导过程。 **语法部分** 在语法方面,重点讲解了...

    二叉排序树与平衡二叉树的实现

    5 调试分析………………………………………………………………………… 14 5.1 时间复杂度的分析………………………………………………………………14 5.2 运行结果…………………………………………………………...

    最新JAVA编程题全集_50题及答案

    题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? //这是一个菲波拉契数列问题 public class lianxi01 { ...

    专升本英语词组.doc

    根据提供的文档信息,我们可以归纳出一系列重要的英语词组及其用法。这些词组对于准备专升本考试的学生来说至关重要,不仅能够帮助他们在阅读理解部分更好地理解文章内容,还能提升写作和口语表达的能力。下面我们将...

    c#学习笔记.txt

    通过使用方法参数关键字,可以更改这种行为。如果没有ref,out则默认为值传递,虽然可以在方法中修改这个参数的值,但是修改后的值不会还会到调用该方法的程序中. params :params 关键字可以指定在参数数目可变处采用...

    2019年八年级英语下册Unit5Whatwereyoudoingwhentherainstormcame知识点总结新版人教新目

    】是2019年人教新目标版八年级英语下册的一个单元,主要聚焦在谈论过去发生的事情,特别是使用过去进行时态来描述过去的某一时刻或某段时间内的动作。以下是本单元的重点知识详细解析: **一、主题** 本单元的主题...

    FMLDATA的源码

    四、使用方法: FMLDATA.DLL提供了两个公式/函数,一个用于写数据,一个用于读数据。 (一)写数据: 写数据的公式为: "FMLDATA@WRITE"(X,N) 第一个参数X是个序列(指标),可以是CLOSE、OPEN等,也可以是公式中的...

    仁爱英语八年级上UnitTopicSectionCPPT课件.pptx

    同时,学生需要找出并猜测新词汇的意思,如"pass by"(经过)、"fall down"(落下)等,以及关键短语,如"be afraid to do"(害怕做……)和"a fourth match"(第四根火柴)。此外,学生还要学习如何用"a / an + 序...

    【03-流程控制与数组】

    •do while 循环语句里,即使test_expression循环条件的值开始是假,do while循环也会执行循环体。因此,  do while循环的循环体至少执行一次。 本文原创作者:pipi-changing 本文原创出处:...

    开源一STM32项目,CAN,UART,Input检测 原创相对高效性能与代码重用平衡思路,可直接做工程模板

    上层使用方法:循环检测UART1_RcvdSize()是否大于0,大于则进行读取等下一步处理,也可再定义高一级的应用层帧缓冲,以实现应用层的完整帧处理,或者增加一个对接收FIFO的预读功能,即读取时对接收FIFO中的帧进行...

    2017版高考英语一轮复习语法专题第二部分词法篇_其他词类专题2冠词素材外研版

    掌握冠词的使用对于理解和表达英语至关重要,尤其是在写作和阅读中,正确使用冠词能使语言更加准确和地道。在复习高考英语时,深入理解这些冠词的用法规则,对于提高语法水平和应试能力具有很大帮助。

    数据结构(C++)有关练习题

    在计算机科学发展过程中,早期数据结构教材大都采用PASCAL语言为描述工具,后来出现了采用C语言为描述工具的教材版本、至今又出现了采用C++语言为描述工具的多种教材版本。本教实验指导书是为已经学习过C++语言的...

    个人笔记--JAVA基础

    Java API文档是Java开发者的重要资源,提供了所有Java标准库的详细说明,包括类、接口、枚举和异常等的使用方法。 **1.7. 集成开发工具** - **1.7.1. 常用的集成开发工具** - Eclipse - IntelliJ IDEA - ...

    华为编程规范

    - 注释格式应尽量统一,推荐使用“/*……*/”。 - 注释语言建议以中文为主,除非能够用流利的英文表达。 8. **代码自注释**: - 通过合理的命名和结构化代码来实现一定程度的自注释效果。 9. **程序块结束标记*...

    整理后java开发全套达内学习笔记(含练习)

    char 16bit, 0~2^16-1 (2^16=6万6) byte 8bit, -2^7~2^7-1 (2^7=128; 注意:两个 byte 数相加,变 int 型) short 16bit, -2^15~2^15-1 (2^15=32768) int 32bit, -2^31~2^31-1 (2147483648,20亿,10位有效数字) ...

    基于K-means聚类算法的客户价值分析研究

    假定数据点D={X1…….Xn},任务是找到 k 个聚类{C1……Ck}: 伪代码如下: for k=1,…n,令 R(k)为从 D 中随机选取的一个点; while 在聚类 Ck 中有变化发生 do 形成聚类; for k=1,….,n do Ck={X 属于 ...

    初识回溯算法 doc

    do while 不是终点 是否有可以移动的相邻位置? if 有可以移动的相邻位置 then 将当前位置入栈 移动到相邻位置 else 若栈空,结束寻找过程,并返回 0 回溯到栈顶中的位置 endif loop 在求精以上算法程序的过程中,...

Global site tag (gtag.js) - Google Analytics