【C】do{}while、do{}while(false)、do{}while(__LINE__==-1)使用分析
2016-12-24 18:17
399 查看
参考链接:链接原文
上述代码三段代码等价的,其中
使用场景
1.用在出错处理中,替代goto
使用
但由于
使用
2.用在宏中,用来封闭代码
一般会定义这么一个宏专门用于封闭代码,防止在if…else…语句中出错:
比如定义一个简单的宏,有下面四种方法,第一和第二种是一样的,后面两种在if/else结构中就会出错:
分析:
比如下面语段会编译出错:
将其宏展开就会发现,这里多出一个分号,造成后面的else无法找到匹配的if,同样的,将第四种宏展开也可以发现类似的问题。
当只有if时能编译,但用第四种也会出问题
展开后会发现无论ret为何值,ioreg2 = 0;这条语句都会被执行
如果写成这样,就不会出问题,但宏的定义需要考虑到通用性,所以,一般用
展开后为
do{}while(0)
do{}while(false)
do{}while(__LINE__==-1)
上述代码三段代码等价的,其中
__line__代表当前代码在源文件的行号,它是大于0的。
使用场景
1.用在出错处理中,替代goto
使用
goto
bool Func() { bool ret = true; ret=Func1(); if(!ret) goto err; ret=Func2(); if(!ret) goto err; ret=Func3(); if(!ret) goto err; //... return true; err: //... return false; }
但由于
goto地位比较特殊,对是否使用它有很大争议,容易让程序逻辑不易看清,下面是用
do{}while(0)替代:
使用
do{}while(0)
bool Func() { bool ret = true; do { ret=Func1(); if(!ret) break; ret=Func2(); if(!ret) break; ret=Func3(); if(!ret) break; //... return true; }while(0); //... return false; }
2.用在宏中,用来封闭代码
一般会定义这么一个宏专门用于封闭代码,防止在if…else…语句中出错:
#define st(x) do { x } while (__LINE__ == -1)
比如定义一个简单的宏,有下面四种方法,第一和第二种是一样的,后面两种在if/else结构中就会出错:
#define SET_REGS_1() st( ioreg1 = 0; ioreg2 = 0; ) #define SET_REGS_2() do{ ioreg1 = 0; ioreg2 = 0; }while(__LINE__ == -1) #define SET_REGS_3() { ioreg1 = 0; ioreg2 = 0; } #define SET_REGS_4() ioreg1 = 0; ioreg2 = 0;
分析:
比如下面语段会编译出错:
if(ret) SET_REGS_3(); else { //... }
将其宏展开就会发现,这里多出一个分号,造成后面的else无法找到匹配的if,同样的,将第四种宏展开也可以发现类似的问题。
if(ret) { ioreg1 = 0; ioreg2 = 0; }; else { //... }
当只有if时能编译,但用第四种也会出问题
if(ret) SET_REGS_4();
展开后会发现无论ret为何值,ioreg2 = 0;这条语句都会被执行
if(ret) ioreg1 = 0; ioreg2 = 0;;
如果写成这样,就不会出问题,但宏的定义需要考虑到通用性,所以,一般用
do{}while(0)来封闭代码,这里也同样看出,在写代码时,要有好习惯
if(ret) { SET_REGS_3(); } else { //... }
展开后为
if(ret) { { ioreg1 = 0; ioreg2 = 0; }; } else { //... }
相关文章推荐
- #define st(x) do { x } while (__LINE__ == -1)及“\”分析
- 编程技巧:使用 do {} while (false) 来避免缩进
- 使用do..while 替换 goto
- 在宏定义中使用 do...while
- 笔记:一个do...while的使用!~
- 宏定义中使用do{}while(0)的好处 (转载)
- do{}while(FALSE)知多少
- 使用do…while语句计算1+2+3+...+20的和
- 关于利用scanf()函数做为do-while循环条件的分析
- do...while(FALSE)的两个妙用
- 宏定义中使用do{}while(0)的好处
- do{}while(false);在java中的妙用.
- do{} while(0)的使用
- do...while(false)的妙用
- 宏定义中使用do{}while(0)的好处
- 在宏定义中使用 do...while
- do...while(false)的妙用
- 宏定义中使用do{}while(0)的好处
- (英文)为什么Linux内核中,许多#defines都使用了 do { ... } while(0)?
- 为什么在宏中使用do{...}while(0)结构