1.#define DUMP_WRITE(addr,nr) memcpy(bufp,addr,nr); bufp += nr;
2.#define DUMP_WRITE(addr,nr) {memcpy(bufp,addr,nr); bufp += nr;}
3.#define DUMP_WRITE(addr,nr) do { memcpy(bufp,addr,nr); bufp += nr; } while(0)
为什么要用第三种do-while的形式最好?
看看嵌入下面的代码中会出现什么问题:
if (addr)
DUMP_WRITE(addr,nr);
else
do_something_else();
第一种定义经过预处理后变成这样,导致编译出错:
if (addr)
memcpy(bufp,addr,nr);bufp += nr;
else
do_something_else();
那么又问了,我定义成第二种不就行了吗?可是还是编译不过:
if (addr)
{memcpy(bufp,addr,nr);bufp += nr;}; //语法错误,多了一个分号
else
do_something_else();
第三种在任何情况下都不会有问题:,
if (addr)
do { memcpy(bufp,addr,nr); bufp += nr; } while(0)
else
do_something_else();