以下内容引用cndx100's blog原文地址:http://www.ednchina.com/blog/cndx100/47938/message.aspx
这两天在看别人代码时,发现别人在宏定义中使用了do...while语句,百思不得其解,于是在网上查找了一番,现总结了一下,转帖出来共享!
3,如果出现在判断语句过后的宏,这样可以保证作为一个整体来是实现:
#define foo(x) /
action1(); /
action2();
在以下情况下:
if(NULL == pPointer)
foo();
就会出现action1和action2不会同时被执行的情况,而这显然不是程序设计的目的。
4,以上的第3种情况用单独的{}也可以实现,但是为什么一定要一个do{}while(0)呢,看以下代码:
#define switch(x,y) {int tmp; tmp="x";x=y;y=tmp;}
if(x>y)
switch(x,y);
else //error, parse error before else
otheraction();
在把宏引入代码中,会多出一个分号,从而会报错。
//------------------------------------------------
do...while(0)-妙用 (转...)
sswanglei 发表于 2007-7-1 22:33:00在C++中,有三种类型的循环语句:for, while, 和do...while, 但是在一般应用中作循环时, 我们可能用for和while要多一些,do...while相对不受重视。 但是,最近在读我们项目的代码时,却发现了do...while的一些十分聪明的用法,不是用来做循环,而是用作其他来提高代码的健壮性。 1. do...while(0)消除goto语句。
bool
Execute()
{ // 分配资源 int * p = new int ; bool bOk( true ); // 执行并进行错误处理 bOk = func1(); if ( ! bOk) { delete p; p = NULL; return false ; } bOk = func2(); if ( ! bOk) { delete p; p = NULL; return false ; } bOk = func3(); if ( ! bOk) { delete p; p = NULL; return false ; } // .......... // 执行成功,释放资源并返回 delete p; p = NULL; return true ; }
bool
Execute()
{ // 分配资源 int * p = new int ; bool bOk( true ); // 执行并进行错误处理 bOk = func1(); if ( ! bOk) goto errorhandle; bOk = func2(); if ( ! bOk) goto errorhandle; bOk = func3(); if ( ! bOk) goto errorhandle; // .......... // 执行成功,释放资源并返回 delete p; p = NULL; return true ; errorhandle: delete p; p = NULL; return false ; }
bool
Execute()
{ // 分配资源 int * p = new int ; bool bOk( true ); do { // 执行并进行错误处理 bOk = func1(); if ( ! bOk) break ; bOk = func2(); if ( ! bOk) break ; bOk = func3(); if ( ! bOk) break ; // .......... } while ( 0 ); // 释放资源 delete p; p = NULL; return bOk; }
2 宏定义中的do...while(0) 也许你会说,我们代码的习惯是在每个判断后面加上{}, 就不会有这种问题了,也就不需要do...while了,如: |