内核中一些宏操作的定义
来源:互联网 发布:windows develop 编辑:程序博客网 时间:2024/05/22 11:58
#define DUMP_WRITE(addr,nr) do { memcpy(bufp,addr,nr); bufp += nr; } while(0)
读者想必知道,do-while循环是先执行后判断循环条件。所以这个定义意味着每次引用这个宏操作是会执行循环体一次,而且只执行一次,可是,为什么要这样通过一个do-while循环来定义呢?这似乎有点怪。我们不妨看看其他几种可能。首先,能不能改成如下式样?
00163: #define DUMP_WRITE(addr,nr) memcpy(bufp,addr,nr); bufp += nr;
不行。如果有一段程序在一个if语句中引用这个宏操作就会出问题,让我们通过一个假想的例子来说明:
if(addr)
DUMP_WRITE(addr,nr);
else
do_something_else();
经过预处理后,这段代码就会变成这样:
if(addr)
memcpy(bufp,addr,nr); bufp += nr;
else
do_something_else();
编译这段代码时gcc会失败,并报告语法错误。因为gcc认为if语句在memcpy()以后就结束了,然后却又碰到了一个else。如果把DUMP_WRITE()和do_something_else()换一下位置,编译倒是可以通过,问题却更严重了,因为不管条件满足与否bufp += nr都会得到执行。
读者马上会想到要在定义中加上括号,成为这样:
00163: #define DUMP_WRITE(addr,nr) {memcpy(bufp,addr,nr); bufp += nr;}
可是,上面那段程序还是通不过编译,因为经过预处理就变成这样:
if(addr)
{memcpy(bufp,addr,nr); bufp += nr;};
else
do_something_else();
同样,gcc在碰到else前面的“;”时就认为if语句已经结束,因而后面的else不在if语句中。相比之下,采用do-while的定义在任何一种情况下都没有问题。
- 内核中一些宏操作的定义
- linux内核的宏操作定义之一
- 位操作的一些常用宏定义
- linux内核中的一些关于中断的宏定义
- 浏览器内核一些定义
- RapidJSON的一些方便操作的宏定义
- zend中常见的宏定义操作
- Linux 内核中 likely 与 unlikely 的宏定义解析
- Linux内核源码中使用宏定义的若干技巧
- linux内核中结构体包含宏定义的解释
- linux内核中关于MACH_TYPE_OMAP_4430SDP的定义
- Linux内核中trace_xxxx()函数的定义
- linux/compiler.h 内核内一些关键词的定义
- Linux源代码中一些有意思的宏定义
- arm linux中一些重要的宏及地址定义
- arm linux中一些重要的宏及地址定义
- c中宏定义的一些应用积累
- IOS开发中常用的一些宏定义
- 最新maven 3.3.1+nexus 2.11.2+eclipse4.4+tomcat 8.0私服搭建到使用部署全过程————————by 耗子
- gcc编译命令详解
- 用Quadro卡带Geforce卡实现非SLI多显卡多显示器协同绘制
- SVN 的锁定与解锁
- Intent详解
- 内核中一些宏操作的定义
- 关于MVC4.0 WebAPI上传图片重命名以及图文结合
- OpenCV坐标体系的初步认识
- Android Adapter回调接口
- Intent 详解(转)
- IDL/C 二进制数据的读取和写入
- javascript内存泄露
- OpenGL编程逐步深入(四)Shaders
- 网络术语MSL/TTL/RTT