gcc和Linux内核在平行的发展;
先看一个实例 linux-3.0\fs\proc\Kcore.c
#define DUMP_WRITE(addr,nr) do { memcpy(bufp,addr,nr); bufp += nr; } while(0)
为什么不定义成
#define DUMP_WRITE(addr,nr) memcpy(bufp,addr,nr); bufp += nr;
如果程序在if语句中引用
if (addr)
DUMP_WRITE(addr,nr);
else
do_something_else();
就等于
<pre name="code" class="plain"><pre name="code" class="plain">if (addr) <pre name="code" class="plain"> memcpy(bufp,addr,nr); bufp += nr;
else
do_something_else();
自然,这肯定错误
如果定义成
#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语句结束,也是不对的。