<pre name="code" class="html"><span style="font-family: Arial, Helvetica, sans-serif; font-weight: normal;"><span style="font-size:32px;color:#ff0000;"><u></u></span></span>
<span style="font-size:32px;color:#ff0000;font-weight: normal;"><u>情况1</u></span>
<span style="color:#cc66cc;"></span>
在程序中使用这个宏:
<pre name="code" class="html"><span style="font-family: Arial, Helvetica, sans-serif; font-weight: normal;"><span style="font-size:32px;color:#ff0000;"><u></u></span></span>
<span style="font-size:32px;color:#ff0000;font-weight: normal;"><u>情况1</u></span>
<span style="color:#cc66cc;"></span>
<span style="color:#cc66cc;">if(temp)
<span style="white-space:pre"> </span>test(i);
else
<span style="white-space:pre"> </span>doAnotherThing();</span>
展开之后
<pre name="code" class="objc"><span style="color:#cc66cc;">if (temp)
<span style="white-space:pre"> </span>if(i) dosomething();
else
doAnotherThing();</span>
<span style="white-space:pre"></span>
这样展开的话, 就会出现语义错误
<span style="color:#cc66cc;">if(temp)
<span style="white-space:pre"> </span>test(i);
else
<span style="white-space:pre"> </span>doAnotherThing();</span>
<pre name="code" class="objc"><span style="color:#cc66cc;">if (temp)
<span style="white-space:pre"> </span>if(i) dosomething();
else
doAnotherThing();</span>
<span style="white-space:pre"></span>
如果这样:
<span style="color:#cc66cc;">#define test(i)\
do\
{\
<span style="white-space:pre"> </span>if(i) dosomething();\
}while(0)</span>
将程序包裹好,就不会出现语义错误,完美解决了这个问题
<span style="color:#cc66cc;">#define test(i)\
do\
{\
<span style="white-space:pre"> </span>if(i) dosomething();\
}while(0)</span>
情况2
宏定义中含有多条语句
<span style="color:#cc66cc;">#define test(p)\
free(p);\
p = NULL;</span>
代码如下
<span style="color:#cc66cc;">#define test(p)\
free(p);\
p = NULL;</span>
<span style="color:#cc66cc;">if(NULL != p)
test(p)
else
printf("p != NULL\n");</span>
宏展开之后
<span style="color:#cc66cc;">if(NULL != p)
test(p)
else
printf("p != NULL\n");</span>
<span style="color:#cc66cc;">if(NULL != p)
</span><pre name="code" class="objc"><span style="color:#cc66cc;"><span style="white-space:pre"> </span>free(p);
p = NULL;</span>
elseprintf("p != NULL\n"); p = NULL;这条语句无论if是否满足都会执行,如果加上{...}封装之后,一般使用函数的
<span style="color:#cc66cc;">if(NULL != p)
</span><pre name="code" class="objc"><span style="color:#cc66cc;"><span style="white-space:pre"> </span>free(p);
p = NULL;</span>