Chinaunix首页 | 论坛 | 博客
  • 博客访问: 238053
  • 博文数量: 52
  • 博客积分: 285
  • 博客等级: 二等列兵
  • 技术积分: 585
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-25 23:38
文章分类

全部博文(52)

文章存档

2013年(43)

2012年(9)

我的朋友

分类: LINUX

2013-07-23 11:49:14

Linux内核的代码中使用了大量inline函数,不过,这并未消除对宏操作的使用,内核中仍有许多宏操作定义。人们常常会对内核代码中一些宏操作的定义方式感到迷惑不解,有必要在这里

做一些解释.
eg.fs/proc/kcore.c

#define DUMP_WRITE(addr,nr) do{memcpy(bufp,addr,nr);bufp += nr;}while(0)

Question:为什么要通过do-while循环方式定义呢?首先,能不能定义成如下方式?

#define DUMP_WRITE(addr,nr) memcpy(bufp,addr,nr);bufp += nr;

Answer:No.
eg.
  if(addr)
     DUMP_WRITE(addr,nr);
  else
     do_something_else();

经过预处理以后:
   if(addr)
     memcpy(bufp,addr,nr);bufp += nr;
   else
     do_something_else();

显然,编译这段代码时gcc会失败,并报告语法出错.

聪明如你,第一感觉可能会想到如下方式:   
 #define DUMP_WRITE(addr,nr){memcpy(bufp,addr,nr);bufp += nr;}

然而,经过预处理后:
   if(addr)
     {memcpy(bufp,addr,nr);bufp += nr;};
   else
      do_something_else();

看到这里,这只是冰山一角不得不佩服,内核设计者的匠心独运与谨慎了。呵呵。希望后来者如我们,能在前辈开辟的道路上走的更远。^^

参考 《Linux内核情景分析(上)》(毛德操 胡希明著)

阅读(1542) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~