do...while(0)解析
来源:互联网 发布:布尔人 知乎 编辑:程序博客网 时间:2024/06/06 12:23
为什么在内核中碰到很多 #define ... do{...} while(0) ?
有以下几点原因:
1、空语句在编译的时候会出现警告,所以有必要用#define FOO do{ } while(0)
2、给定一个基本块,可以在里面定义局部变量
3、为了能够在条件语句中使用复杂的宏定义。例如下面这段代码:
如果这样用:
宏展开之后为
这样,if条件之后包含了printf()语句,而do_something_useful()调用不能按照预期那样工作。而是用do {...} while(0)定义后,就会展开成以下语句:
这是我们所期望的。
如果你希望定义一个包含多行语句和一些局部变量的时候. 一般的定义方式只能这样:
然而在某些情况下,这样并不能正常工作. 下面是包含两个分支的if语句:但这样却只能展开成单分支的if语句,如下:
问题是由于在语句块后直接加入分号(;)引起的. 解决办法是将语句块放入 do 和 while (0)中间.这样就得到了一条单语句, 而不是被编译器判断为语句块.现在的if语句如下:
假设有这样一个宏定义
现在在程序中这样使用这个宏:
一切看起来很正常,但是仔细想想。这个宏会展开成:
这时的else不是与第一个if语句匹配,而是错误的与第二个if语句进行了匹配,编译通过了,但是运行的结果一定是错误的。
为了避免这个错误,我们使用do{….}while(0) 把它包裹起来,成为一个独立的语法单元,从而不会与上下文发生混淆。同时因为绝大多数的编译器都能够识别do{…}while(0)这种无用的循环并进行优化,所以使用这种方法也不会导致程序的性能降低。
阅读全文
0 0
- do...while(0)解析
- 【C语言】 Linux内核源码-- 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) 妙用
- SpringBoot返回json数据
- JVM内存管理、JVM垃圾回收机制、新生代、老年代以及永久代
- 离散题目18(传递闭包)
- HDU
- 算法设计与应用基础
- do...while(0)解析
- Solr基础入门介绍
- 微信小程序学习笔记(1)
- Spring PropertyPlaceholderConfigurer获取属性文件值
- C语言文件操作lseek
- Linux后台Daemon中打印debug message的方法
- C语言指针的例题
- C++ 06 —— 拷贝构造函数
- 关于CSS的总结