Define 语句中的do{} while(0)

经常在define语句中看到用do{} while(0)将一个程序片段包起来,一直感觉很奇怪,经查找,才发现这是在define语句使用中的一个tricky的情况。
define表达使用do{} while(0)的两个例子:

#define LIST_INSERT_AFTER(listelm, elm, field) do { \
if ((LIST_NEXT((elm), field) = LIST_NEXT((listelm), field)) != NULL)\
LIST_NEXT((listelm), field)->field.le_prev = \
&LIST_NEXT((elm), field); \
LIST_NEXT((listelm), field) = (elm); \
(elm)->field.le_prev = &LIST_NEXT((listelm), field); \
} while (0)


#define INIT_LIST_HEAD(ptr) do { \
(ptr)->next = (ptr); (ptr)->prev = (ptr); \
} while (0)


下面以第二个define语句为例子说明不使用do{}while(0)会用什么情况发生。
这是测试代码

#define INIT_LIST_HEAD(ptr) {(ptr)->next = (ptr); (ptr)->prev = (ptr);}

struct node {
struct node* next;
struct node* prev;
int val;
};

void main(){
struct node head;
if(1 == 0)
INIT_LIST_HEAD(&head);
else
head.val = 0;
}

预编译后的相关代码:

if(1 == 0)
{(&head)->next = (&head); (&head)->prev = (&head);};
else
head.val = 0;

然后编辑就会报错:main.c:13: error: ‘else’ without a previous ‘if’
相信看到这里后各位就会明白使用do{}while(0)的原因了吧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值