`
RednaxelaFX
  • 浏览: 3022757 次
  • 性别: 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都不认得- -

相关推荐

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

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

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

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

    单片机实验-单片机实验报告

    程序先点亮D1,延时一段时间(2秒钟),再顺序点亮D1……D7,然后又是D0。同时只能有一个灯亮。设晶振频率fosc=6MHz,要求亮灯2秒后下一个灯点亮。 二、实验目的: 1、学习89C51的功能及编程方法。 2、学习P2口的使用...

    c#学习笔记.txt

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

    FMLDATA的源码

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

    【03-流程控制与数组】

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

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

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

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

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

    整理后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