宏可以执行复合赋值

时间:2013-01-21 14:50:46

标签: c

我读了很少关于宏的gnu online docs并且对这句话感到很困惑:

  

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

所以如果宏可以执行复合赋值,我会徘徊,怎么样?

3 个答案:

答案 0 :(得分:1)

#define PASTE(a,b) a##b
int foo;
foo PASTE(+,=) 2;

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

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 */

然后,在开关中,你可以写

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

答案 1 :(得分:0)

我认为,文档说的是:

#define COMPST(x, y) x ## y

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

答案 2 :(得分:0)

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

#define INCREMENT(x) ((x) += 1)

main() {
   int n=42;
   INCREMENT(n);
}

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