今天碰到一个判断错误返回的宏,IF_FAILED_RETURN_XXX(result),之前没有细究,顾名思义地使用着,而今天特地进去看了下,发现该宏如下:
#define IF_FAIL_RETURN_XXX(result) \
do \
{ \
... \
}while(0)
瞬间内牛满面……想起大学时阅读linux内核源码过程中,第一次遇到这种用法时觉得很是惊艳。
为什么会出现do{...}while(0)呢?
首先是基本的宏用在if判断语句时会出现问题:
#define SomeMacro(x) \
expr1_doSth_with(x); \
expr2_doSth_with(x);
//使用
if(x)
SomeMacro(x);
else
x++;
//展开
if(x)
expr1_doSth_with(x);
expr2_doSth_with(x);;
else
x++;
再为这个宏添加上一个花括号来包容语句块:
#define SomeMacro(x) \
{ \
expr1_doSth_with(x); \
expr2_doSth_with(x); \
}
//使用
if(x)
SomeMacro(x);
else
x++;
//展开
if(x)
{
expr1_doSth_with(x);
expr2_doSth_with(x);
};
else
x++;
这种情况下使用宏就要小心这个分号了。可能有人觉得不要添加那个括号就好了,不过这样看起来很奇怪:
#define SomeMacro(x) \
{ \
expr1_doSth_with(x); \
expr2_doSth_with(x); \
}
//使用
if(x)
SomeMacro(x)
else
x++;
看到上面的if-else语句,是不是总觉得很别扭呢? :) C++使用者总有个分号结尾瘾……
最后一点看似不重要却也挺重要的作用是:对IDE良好。如果将分号放到宏里面,IDE检查不到行末的分号,会造成缩进错误。这一点其实也可以归于上一句话,C++的开发环境有分号结尾瘾……LOL
分享到:
相关推荐
51单片机-C语言for语句do...while语句if...else...语句产生随机数rand()常用基本语句例程源码 do...while语句 for语句 if...else...语句 switch-case-break语句 while与do...while区别 while语句 不同类型数据的差异...
今天咱们学习一下do......while的用法,快来学学吧。
do..while循环.pngdo..while循环.pngdo..while循环.pngdo..while循环.pngdo..while循环.pngdo..while循环.pngdo..while循环.png
C#040do...while语句
Java循环语句之do...while共3页.pdf.zip
前端框架Dart的 循环语句 for while do...while break continue 多维列表循环详解,包括PPT和源码
经过自己精心整理的自学笔记-视频来源-老九学堂
while循环九九乘法表、do.while循环九九乘法表、for循环_九九乘法表
在现实运用当中有时需要进行重复的操作,比如说打印100遍的同一语句;这时候就需要用到循环;for循环,while循环,do...while循环
C++ 2015 英文第三章 数组do...while语句
学习java基础(2)循环语句for、while、do...while(csdn)————程序
实现while和dowhile控制.go
dowhile.exe
do...while语句使用举例,分享给大家。
下面小编就为大家带来一篇浅谈php中的循环while、do...while、for、foreach四种循环。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
最新单片机仿真 用do-while语句控制P0口8位LED流水点亮最新单片机仿真 用do-while语句控制P0口8位LED流水点亮最新单片机仿真 用do-while语句控制P0口8位LED流水点亮最新单片机仿真 用do-while语句控制P0口8位LED流水...
test11比较dowhile.cpp
1+2+3...程序,用do while循环方法求整数的和运算,VB.net2008源代码
while和do-while的使用以及区别