六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 45|回复: 0

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

[复制链接]

升级  6.67%

16

主题

16

主题

16

主题

秀才

Rank: 2

积分
60
 楼主| 发表于 2013-1-26 12:30:23 | 显示全部楼层 |阅读模式
经常在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)的原因了吧。
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表