关于宏定义的形式

 

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();

你可能感兴趣的:(Linux,C/C++)