MACRO do-while(0) 的几个用法
来源:互联网 发布:阿里云 包括域名 编辑:程序博客网 时间:2024/06/08 05:36
作者:邹南,华清远见嵌入式培训中心讲师。
一、格式
define MACRO_NAME(para) do{macro content}while(0)的格式,总结了以下几个原因:
1、空的宏定义避免warning:
#define foo() do{}while(0)
2、存在一个独立的block,可以用来进行变量定义,进行比较复杂的实现。
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;6
x=y;
y=tmp;
}
if(x>y)
switch(x,y);
else //error, parse error before else
otheraction();在把宏引入代码中,会多出一个分号,从而会报错。
(Dave Miller的说法):
编译器对于空语句会给出告警,这是为什么#define FOO do{ }while(0);
给定一个基本块(局部可视域),定义很多局部变量;
(Ben Collins的说法):
在条件代码中,允许定义复杂的宏。可以想像有很多行宏,如下代码:
(Per Persson的说法):
像 Miller and Collins指出的那样,需要一个块语句包含多个代码行和声明局部变量。但是,本质如下面例子代码:
#define exch(x,y) { int tmp; tmp=x; x=y; y=tmp; }
上面代码在有些时候却不能有效工作,下面代码是一个有两个分支的if语句:
if (x > y)
exch(x,y); // Branch 1else do_something(); // Branch 2展开后代码如下:
if (x > y) {
// Single-branch if-statement!!!
int tmp; // The one and only branch consists
tmp = x; // of the block.
x = y;
y = tmp;};
嵌入式及3G相关资源及学习请点击:嵌入式开发视频 android开发视频 android培训 3G培训 QT培训 QT开发视频 物联网培训 物联网技术视频 嵌入式学习
- MACRO do-while(0) 的几个用法
- MACRO do-while(0) 的几个用法
- do...while(0)的用法
- do{} while(0)的用法
- do{...}while(0)的用法
- do while(0)的用法
- do...while(0)的用法
- do {} while (0) 用法
- do while(0) 用法
- do...while(0)用法
- do{}while(0)用法
- do{}while(0)用法
- do{...}while(0)的用法小结
- do{}while(0)控制结构的用法
- do while(0)宏的用法
- do{...}while(0)的意义和用法
- do{...}while(0)的意义和用法
- do{...}while(0)的意义和用法
- 开放式有关软件自动化测试和问题
- 对List进行排序的方法
- 隐马尔科夫模型HMM自学(1)
- fastdb一个表支持注册到多个库
- 数字图像处理的研究方法
- MACRO do-while(0) 的几个用法
- Cannot use typeid with -fno-rtti错误的解决
- 那些年,我还在学习Ajax 学习笔记
- Android 自定义RadioButton的样式
- php-Arrays 函数-array_merge_recursive-递归地合并一个或多个数组
- ognl
- ffmpeg命令行选项
- oracle修改字符集
- oracle oui异常