分类: 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内核情景分析(上)》(毛德操 胡希明著)