【发布时间】:2013-01-21 14:50:45
【问题描述】:
【问题讨论】:
标签: c
【问题讨论】:
标签: c
#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 */
【讨论】:
我认为,文档中提到的情况如下:
#define COMPST(x, y) x ## y
int
foo(int x)
{
return x COMPST(+, =) 2;
}
【讨论】:
当然,宏可以执行任何您可以在 C 代码中实现的功能:
#define INCREMENT(x) ((x) += 1)
main() {
int n=42;
INCREMENT(n);
}
你读到的那句话意味着我怀疑你不感兴趣的另一件事......
【讨论】: