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);}; elsehead.val = 0;
然后编辑就会报错:main.c:13: error: ‘else’ without a previous ‘if’
相信看到这里后各位就会明白使用do{}while(0)的原因了吧。
页:
[1]