宏定义中do while(0)使用
来源:互联网 发布:mysql 替换 编辑:程序博客网 时间:2024/04/27 10:34
使用#defines... do{ ... } while(0)有以下几点原因:
1、空语句在编译时候会出现警告,所以有必要用#define FOO do { } while(0).
2、这样做是为了能够在里面定义局部变量
3、这样做是为了能够在条件语句中使用复杂的宏定义. 例如下面这段代码:
#defineFOO(x) \
printf("arg is %s\n", x); \
do_something_useful(x);
如果这样用:
if(blah == 2)
FOO(blah);
将会被展开为:
if (blah == 2)
printf("argis %s\n", blah);
do_something_useful(blah);;
这样,if条件之包含了printf()语句,而 do_something_useful()调用不能按期望那样工作。而使用 do { ... } while(0)定义后,就会展开成以下语句:
if (blah ==2)
do{
printf("argis %s\n", blah);
do_something_useful(blah);
}while (0);
这是所期望的状况.
4、如果你希望定义一个包含多行语句和一些局部变量的时候. 一般的定义方式只能这样:
#define exch(x,y) { int tmp; tmp=x;x=y; y=tmp; }
然而在某些情况下,这样并不能正常工作. 下面是包含两个分支的if语句:
if (x > y)
exch(x,y); // Branch 1
else
do_something(); // Branch 2
但这样却只能展开成单分支的if语句,如下:
if (x > y){ // 单分支if
int tmp;
tmp = x;
x = y;
y = tmp;
}
; // 空语句
else // 错误!!! "parse error before else"
do_something();
问题是由于在语句块后直接加入分号(;)引起的.解决办法是将语句块放入 do 和 while (0)中间.这样就得到了一条单语句, 而不是被编译器判断为语句块.现在的if语句如下:
if (x > y)
do {
inttmp;
tmp= x;
x =y;
y =tmp;
} while(0);
else
do_something();
- 宏定义中do while(0)使用
- 在宏定义中使用 do...while
- 在宏定义中使用 do...while
- 宏定义中使用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)的好处
- C++设计模式----策略模式
- wpa_supplicant 处理步骤
- struts工作原理
- js 定义类对象
- ORA-01791: not a SELECTed expression 一个不是 bug 的 bug!
- 宏定义中do while(0)使用
- fedora自动化编译autotools的使用(转载)
- 未初始化和非法的指针
- C语言数据类型32位和64位不同
- HDU 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活
- zookeeper分布式配置管理
- 如何用js判断文件是否存在
- android之webservice开发
- 双向链表插入与删除