继续阅读文档,特别是有关宏的章节!
宏在编译时执行。它们通常扩展为新的代码片段,然后编译器需要进一步处理。
对我来说最大的区别是Rust宏是卫生的。该书有一个例子说明了卫生的作用,并且还说:
每个宏扩展发生在单独的“语法上下文”中,并且每个变量都标记有其引入的语法上下文。
它使用了这个例子:
例如,这个C程序输出13而不是预期的25。
#define FIVE_TIMES(x) 5 * x
int main() {
printf("%d\n", FIVE_TIMES(2 + 3));
return 0;
}
除此之外, Rust 宏
5 * 2 + 3
而不是5 * 5
。值得一提的是,由于大多数人可能不会阅读链接,因此FIVE_TIMES(x)
将把x
视为操作2+3
,而不是2+3 = 5
的结果。将2+3代入公式,得到5*2+3
,按照运算顺序,首先计算5*2=10
,然后加上3得到13。因此,如果你从字符串的角度来看,这只是一个未求值的替换。 - oooyaya