`
peng_wp
  • 浏览: 41263 次
社区版块
存档分类
最新评论

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)的原因了吧。
分享到:
评论

相关推荐

    C 语言函数宏封装妙招C 语言函数宏封装妙招 1. 函数宏介绍 函数宏,即包含多条语句的宏定义,其通常为某一被频繁调用的功能的

    因此,在工程中,一般使用三种方式来对函数宏进行封装,分别为 {}、do{...}while(0) 和 ({})。下文将一一对三种方式进行分析,比较各自的优劣点。 2. {} 方式 INT_SWAP 宏使用 {} 封装后形态如下: 复制 #define...

    2.第二章 结构化程序设计初探.txt

    C语言中循环结构一般由while、do…while和for语句实现。 2.while语句。while语句圆括号()中的表达式是进行循环操作的条件,值为真时执行循环体,然后再判断条件表达式的值,若为真重复执行循环体,条件表达式值为...

    Arduino编程参考手册中文版(带目录适合打印).rar

    do...while 10 break 11 continue 11 return 12 goto 13 相关语法 14 分号 14 大括号 15 注释 17 define 18 include 19 算术运算符 20 赋值 20 加,减,乘,除 21 取模 22 比较运算符 24 if(条件) and ==, !=, <, >...

    leetcode2sumc-LeetCode:[C][C++]继续编码

    如果宏不止一条语句,则使用“do { ... } while (0)”,以便尾随分号起作用。 # define TRUE ( 1 ) # define FALSE ( 0 ) # define DBG_PRINT (fmt, ...) \ do { \ printf (fmt, ##__VA_ARGS__); \ } while ( 0 ) 对...

    uboott移植实验手册及技术文档

    实验三 移植U-Boot-1.3.1 实验 【实验目的】 了解 U-Boot-1.3.1 的代码结构,掌握其移植方法。 【实验环境】 ...#define TWRPH0 4 #define TWRPH1 2 #endif #if defined(CONFIG_S3C2440) ...

    Objective-C2.0程序设计

    12.1 #define语句 12.1.1 更高级的定义类型 12.1.2 #运算符 12.1.3 ##运算符 12.2 #import语句 12.3 条件编译 12.3.1 #ifdef、#endif、#else和#ifndef语句 12.3.2 #if和#elif预处理程序语句 12.3.3 #undef语句 12.4...

    计算机基础程序设计--复习题.doc

    以下语句中,不正确的有( ) A. int[] a; B. int a[]=new int[2,3]; C. int[]a={1,3}; D. int a=new int[]{1,3}; 15.文本框控件的( )属性用来设置其是否是只读的。 A. ReadOnly B. Locked C. Lock D. Style 16....

    c#程序设计试题.doc

    default then while C. bool class long D. goto unit char 4. 能作为C#程序的基本单位是( )。 A. 字符 B. 语句 C. 函数 D. 源程序文件 5. 一个C#程序总是调用哪个函数作为开始( )。 A. main B. MAIN C. Main D. ...

    现代C++程序设计

    3.7 do while循环 3.8 跳转语句 3.8.1 break语句 3.8.2 continue语句 3.9 问题发现与解决 3.9.1 五个常见错误 3.9.2 调试程序 3.10 C++类与vector类 3.11 总结 3.12 练习 复习题 第4章 函数一:基础 4.1 C++中的...

    PIC16F877 的外围功能模块

    }while(SSPIF==0); /*等待发送完毕*/ SSPIF=0; /*清除SSPIF 标志*/ } /*主程序*/ main() { unsigned I; initial(); /*系统初始化*/ SPIINIT() ; /*SPI初始化*/ for(i=8;i>0;i--) /*连续发送8 个数据*/ { data=...

    Visual C++开发经验技巧宝典(第1章)

    0007 do while循环的分析与使用 4 0008 利用条件运算符简化代码 4 0009 使用exit函数退出进程 5 0010 函数exit的注意事项 5 0011 调试无限循环 5 0012 控制台输入/输出 5 0013 delete与delete []的差别...

    C语言程序设计(高清PDF)

    3.4.1 while语句 47 3.4.2 do... while 语句 49 3.4.3 for 语句 50 3.4.4 break与continue语句 53 3.4.5 程序应用举例 54 第4章 函数 57 4.1 函数说明与返回值 57 4.1.1 函数的类型说明 57 4.1.2 返回语句 58 4.2 ...

    【全新正版】现代C++程序设计(原书第2版)

    3.7 do while循环 3.8 跳转语句 3.8.1 break语句 3.8.2 continue语句 3.9 问题发现与解决 3.9.1 五个常见错误 3.9.2 调试程序 3.10 C++类与vector类 3.11 总结 3.12 练习 复习题 第4章 函数一:基础 4.1 C++中的函数...

    C语言程序设计(PDF格式)

    3.4.1 while语句 47 3.4.2 do... while 语句 49 3.4.3 for 语句 50 3.4.4 break与continue语句 53 3.4.5 程序应用举例 54 第4章 函数 57 4.1 函数说明与返回值 57 4.1.1 函数的类型说明 57 4.1.2 返回语句 58 4.2 ...

    C语言程序设计.rar

    3.4.1 while语句 47 3.4.2 do... while 语句 49 3.4.3 for 语句 50 3.4.4 break与continue语句 53 3.4.5 程序应用举例 54 第4章 函数 57 4.1 函数说明与返回值 57 4.1.1 函数的类型说明 57 4.1.2 返回语句 58 4.2 ...

    《C语言程序设计》-PDF格式

    3.4.1 while语句 47 3.4.2 do... while 语句 49 3.4.3 for 语句 50 3.4.4 break与continue语句 53 3.4.5 程序应用举例 54 第4章 函数 57 4.1 函数说明与返回值 57 4.1.1 函数的类型说明 57 4.1.2 返回语句 58 4.2 ...

    轻松学C#(图解版)

    5.3.2 do-while语句 81 5.3.3 for语句 82 5.3.4 foreach语句 85 5.4 跳转语句 85 5.4.1 break语句 85 5.4.2 continue语句 86 5.4.3 goto语句 86 5.5 小结 87 5.6 习题 87 第6章 数组 91 6.1 初识数组 91 6.2 基本...

Global site tag (gtag.js) - Google Analytics