关于宏中使用do{}while(0)的作用
2017-12-02 14:44
155 查看
关于do{}while(0),大家肯定不会陌生,就是do 里面的循环体执行一次,且仅执行一次。那这样和普通的语句有什么区别呢?在宏中,这样做是为了保证宏的正确执行(行为一致),就跟if(n ==0 ) ,大家会写成if(0 == n) 一样。一下是一个例子,便于理解。
看着个例子,!flag为NULL,DIVISION的宏中的add(),div()是不应该被执行的。但实际的结果确是
那么为什么会出现这种现象呢?当我们按照宏进行替换时,代码就会变成这样
所以便会出现非预期现象。所以为了保证宏在任何情况下的一致性,则需加上do{}while(0)语句。
这样就不会出现这种问题了。这种用法大量见于宏定义中含有的多行语句的时候。
#include "stdio.h" #define DIVISION(X,Y) add((X) , (Y));\ div((X), (Y)) int add(int x, int y) { printf("add"); } int div(int x, int y) { printf("div"); } int main(int argc, _TCHAR* argv[]) { bool flag = true; if (!flag) DIVISION(6, 2); getchar(); return 0; }
看着个例子,!flag为NULL,DIVISION的宏中的add(),div()是不应该被执行的。但实际的结果确是
那么为什么会出现这种现象呢?当我们按照宏进行替换时,代码就会变成这样
if(!flag) add(6,2);div(6,2);编译器便会认为成这样:
if(!flag) add(6,2); div(6,2);
所以便会出现非预期现象。所以为了保证宏在任何情况下的一致性,则需加上do{}while(0)语句。
#define DIVISION(X,Y) \ do{\ add((X),(Y));\ div((X),(Y));\ }\ while(0)
这样就不会出现这种问题了。这种用法大量见于宏定义中含有的多行语句的时候。
相关文章推荐
- 关于do...while(0)在宏中的应用
- 为什么要在宏中使用 do{...}while(0) (转)
- 为什么在宏中使用do{...}while(0)结构
- 内核代码宏中 do{...}while(0) 的作用以及宏中#和##的作用及典型应用
- 内核代码宏中 do{...}while(0) 的作用
- 关于do{}while()的代码讨论
- do{} while(0)的使用
- 使用do..while 替换 goto
- 宏定义中使用do{}while(0)的好处
- do{ }while(0) 的宏的作用!
- do{}while(0) 的作用
- 关于利用scanf()函数做为do-while循环条件的分析
- (英文)为什么Linux内核中,许多#defines都使用了 do { ... } while(0)?
- @while+do。。。done和case。。。esac或者if。。。then。。fi的嵌套使用以及if的!判断@
- 编程技巧:使用 do {} while (false) 来避免缩进
- 为什么使用do{...} while(0) ?
- 宏定义中使用do{}while(0)的好处
- 宏定义中使用do{}while(0)的好处
- 宏定义中使用do{}while(0)的好处
- 关于do...while();循环最后的分号。