zoukankan      html  css  js  c++  java
  • C 语言宏定义中使用do...while(0)

     最近看到C语言的项目中在宏定义中使用了do...while(0),感到是个知识点,特来总结。

     先看这句话:do{...}while(0)在C中是唯一的构造程序,让你定义的宏总是以相同的方式工作,这样不管怎么使用宏(尤其在没有用大括号包围调用宏的语句),宏后面的分号也是相同的效果。这句话的意思是说,在宏定义中使用do...while(0)包含的所有语句是一个代码块,不会受到{};的影响。

    看一个例子:

    #include <stdio.h>
    #include <stdlib.h>
    #define TEST(p)                             
            do                                  
            {                                   
                if(p!=NULL)                     
                {                               
                    free(p);                    
                    printf("free success!
    ");  
                }                               
                p=NULL;                         
            }while(0)
    
    int main()
    {
        int *p=NULL;
        p=(int*)malloc(sizeof(int));
        TEST(p);
        printf("---------done!---------
    ");
        return 0;
    }
    

      的作用是这一行的语句没有完,下一行内容是跟上一行联在一起的。

    再来看一个出错的例子:

    宏定义:  #define foo(x) bar(x); baz(x)

    然后调用:       foo(x);  这样根据宏替换的原则就是:  bar(x);baz(x);          这是正确的!

    但是如果这样:     if()

              foo(x)

    就会被替换成:    if()

              bar(x);

            baz(x);              这显然是和我们希望执行的是不一样的!

    为什么不用大括号直接把宏包围起来呢?为什么非得使用do/while(0)逻辑呢?

    按照上面的例子:

    if ()

    {

        bar(wolf);
        baz(wolf);
    };     //最后会添加;,在语法上是错误的!
  • 相关阅读:
    How to Compile Java DBus
    BZOJ 2783 JLOI 2012 树 乘+二分法
    Robotium原则的实施源代码分析
    基本的负载均衡算法
    人大、上财、复旦、上交四校2013年应届金融硕士就业去向
    2014届上财金融硕士就业情况
    三跨),总分420+
    复旦金融专硕和上财金融专硕
    一个三跨考生三战上海财经大学金融硕士的考研经验
    董某某
  • 原文地址:https://www.cnblogs.com/scf141592/p/7513943.html
Copyright © 2011-2022 走看看