zoukankan      html  css  js  c++  java
  • do{...}while(0)的作用

    不是为了循环的while。

    1.用于宏定义,保证宏一定按照想要的方式执行。

    #define   foo(x)     start(x); end(x)

    if(flag)

    foo(x);

    扩展以后的结果 

    if(flag)

    start(x);

    end(x);

    如果是do{..}while(0)的形式,可以保证宏按照定义的预期执行,并且必定执行一次。

    #define foo(x)   do{start(x);end(x)}while(0)

    if(flag)

    foo(x);

    扩展以后的结果

    if(flag)

      do{

    start(x);

    end(x);

    }

    while(0)

    会被正确执行。

    其实这个我觉得宏也可以解决,加上作用域。

    #define foo(x) {start(x); end(x)} 

    2. 替代goto完成多分支合并处理。

    char *x = NULL; 

    if(type = PEOPLE)

    x = malloc(sizeof(stPeople));

    do something...

    if(error) 

    goto end; 

    else if(type == MONKEY)

     x = malloc(sizeof(stMonkey));

      do something...

    if(error) 

    goto end; 

    }

    return 0; 

    end: 

    free(x);

    return -1; 

    这种goto语句可以从多层分支中跳出来,集中处理公共事务。

    相比goto的灵活,do{...}while(0)代码更清晰。

    char *x = NULL; 

    do{ 

    if(type = PEOPLE)

    x = malloc(sizeof(stPeople));

    do something...

    if(error) 

    break; 

    else if(type == MONKEY)

      x = malloc(sizeof(stMonkey));

      do something...

    if(error) 

    break; 

    }

    return 0; 

    }

    while(0) 

    free(x);

    return -1; 

     但也不是绝对的,{}范围内是局部变量,和try{}语句块的一样,不能够被语句块以外访问,这是一个极大的麻烦。

  • 相关阅读:
    基于Antlr4编写DSL
    【整理】ANTLR应用案例 | 在路上
    【整理】ANTLR应用案例 | 在路上
    The ANTLR Parser Generator
    ANTLR4权威参考手册
    ANTLR Examples
    ANTLRWorks: The ANTLR GUI Development Environment
    http://www.cnblogs.com/vowei/archive/2012/08/24/2654287.html
    写一个编译器
    写一个编译器
  • 原文地址:https://www.cnblogs.com/learn-my-life/p/4567300.html
Copyright © 2011-2022 走看看