do{...}while(0)的应用

没有检索到摘要

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考:《do{…}while(0)的妙用》


1. 帮助定义宏

在看redis源码时,发现很多宏都用了do{…}while(0),例如在zmalloc.c中用于统计内存使用量时的宏:

#define update_zmalloc_stat_add(__n) do { \
    pthread_mutex_lock(&used_memory_mutex); \
    used_memory += (__n); \
    pthread_mutex_unlock(&used_memory_mutex); \
} while(0)

#define update_zmalloc_stat_sub(__n) do { \
    pthread_mutex_lock(&used_memory_mutex); \
    used_memory -= (__n); \
    pthread_mutex_unlock(&used_memory_mutex); \
} while(0)

如果不用do{…}while(0)会怎么样?以下面的代码为例:

#define swap(a,b) do{ a+=b; b=a-b; a=a-b; }while(0)
int main()
{
	int i=0;
	int j=100;
	if(i<j)
		swap(i,j);
}

展开后的实际代码:

int main()
{
	int i=0;
	int j=100;
	if(i<j)
		do{ i+=j; j=i-j; i=i-j; }while(0);
}

这是没有问题的,如果我们不用do{…}while(0),看看会是什么效果:

#define swap(a,b) a+=b; b=a-b; a=a-b;
int main()
{
	int i=10;
	int j=100;
    if(i<j)
	    swap(i,j);
}

展开后:

int main()
{
	int i=10;
	int j=100;
    if(i<j)
	    i+=j; j=i-j; i=i-j;
}

改变了原来的函数本来的意义(这个例子结果是一样的,举例不好)。
如果加上{}又会是什么效果,这次加上一个else:

#define swap(a,b) {a+=b; b=a-b; a=a-b;}
int main()
{
	int i=10;
	int j=100;
    if(i<j)
	    swap(i,j);
    else{ 	/*code*/    }
}

展开后,是错误代码,else找不到if,因为大括号后不能接“;”:

int main()
{
	int i=10;
	int j=100;
    if(i<j)
	    {i+=j; j=i-j; i=i-j;};
    else{ 	/*code*/    }
}

2. 替换goto

int main()
{
	int i=0;
	/*code*/
	do
	{
		/*code*/
		if(i<0) break;
		/*code*/
		if(0==i) break;
		/*code*/
	}while(0)
	/*code*/
}

while(0){…}也有这个效果。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值