宏函数中do{...}while(0)的用法

<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;">#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;">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是否满足都会执行,如果加上{...}封装之后,一般使用函数的

时候都习惯在函数参数后面加;  这样展开后{ }; 就错误了

但是如果用do{...}while(0)进行包装后, 就完美解决这些问题.






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值