【问题标题】:Can macro perform compound assignments可以宏执行复合赋值吗
【发布时间】:2013-01-21 14:50:45
【问题描述】:

我很少阅读gnu online docs 关于宏的内容,并且对这句话有点困惑:

还可以通过标记粘贴形成多字符运算符,例如 +=

所以我徘徊宏是否可以执行复合赋值,如何?

【问题讨论】:

    标签: c


    【解决方案1】:
    #define PASTE(a,b) a##b
    int foo;
    foo PASTE(+,=) 2;
    

    我唯一一次看到它有用是在字节码解释器的内部循环中,它看起来像一个巨大的案例语句,每个分支中都有非常重复的代码:

    case OP_add: {
        if (sp < 2) goto underflow;
        double x = stack[--sp];
        stack[sp-1] += x;
    } break;
    

    对每个支持的二元算术运算符重复。通过标记粘贴功能,您可以从宏中生成它们:

    #define ARITH_BINOP(name, oper) case OP_##name: { \
        if (sp < 2) goto underflow; \
        double x = stack[--sp]; \
        stack[sp-1] oper##= x; \
    } break /* deliberate absence of semicolon */
    

    然后,在 switch 中,你可以写

    ARITH_BINOP(add, +);
    ARITH_BINOP(sub, -);
    ARITH_BINOP(mul, *);
    /* etc */
    

    【讨论】:

      【解决方案2】:

      我认为,文档中提到的情况如下:

      #define COMPST(x, y) x ## y
      
      int 
      foo(int x)
      {
        return x COMPST(+, =) 2;
      }
      

      【讨论】:

        【解决方案3】:

        当然,宏可以执行任何您可以在 C 代码中实现的功能:

        #define INCREMENT(x) ((x) += 1)
        
        main() {
           int n=42;
           INCREMENT(n);
        }
        

        你读到的那句话意味着我怀疑你不感兴趣的另一件事......

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-03-11
          • 2015-01-22
          • 1970-01-01
          • 2021-03-09
          • 2018-01-12
          • 2016-04-08
          • 1970-01-01
          • 2021-10-22
          相关资源
          最近更新 更多