zoukankan      html  css  js  c++  java
  • 为什么使用do{}while(0)来进行宏定义

    最近发现很多代码在进行宏定义的时候使用喜欢使用
    #define MACRO_NAME(para) do{macro content}while(0)
    的格式,总结了以下几个原因:
     
    1,空的宏定义避免warning:
    #define foo() do{}while(0)
     
    2,存在一个独立的block,可以用来进行变量定义,进行比较复杂的实现。
     
    3,如果出现在判断语句过后的宏,这样可以保证作为一个整体来是实现:
    #define foo(x)
    action1();
    action2();
    在以下情况下:
    if(NULL == pPointer)
       foo();
    就会出现action1和action2不会同时被执行的情况,而这显然不是程序设计的目的。
     
    4,以上的第3种情况用单独的{}也可以实现,但是为什么一定要一个do{}while(0)呢,看以下代码:
    #define switch(x,y) {int tmp; tmp=x;x=y;y=tmp;}
    if(x>y)
    switch(x,y);
    else       //error, parse error before else
    otheraction();
     
    在把宏引入代码中,会多出一个分号,从而会报错。
    其实,这种用法要根据自己的习惯,有的人不习惯在调用宏代码后加上“;”,也有的喜欢,不过,只要在判断语句之后记得加上{}就可以保证不出错了。
  • 相关阅读:
    Business talking in English
    My strength (C-A-R)
    牛排有几分熟怎么说
    深入理解 Java try-with-resource 语法糖
    什么时候用异常,什么时候用断言?
    Java陷阱之assert关键字
    Java断言绝对不是鸡肋
    Java 条件编译
    Java 语法糖详解
    Java中有哪些语法糖?
  • 原文地址:https://www.cnblogs.com/wzd5230/p/3967342.html
Copyright © 2011-2022 走看看