12

我有这个宏:

macro_rules! set_vars {
    ( $($x:ident),* ) => {
        let outer = 42;
        $( let $x = outer; )*
    }
}                                                                             

这扩展了这个调用:

set_vars!(x, y, z);

进入我的期望(来自--pretty=expanded):

let outer = 42;
let x = outer;
let y = outer;
let z = outer;

在随后的代码中,我可以打印x, y, 并且z很好,但outer似乎未定义:

error[E0425]: cannot find value `outer` in this scope
  --> src/main.rs:11:5
   |
11 |     outer;
   |     ^^^^^ not found in this scope

outer如果我将它作为显式宏参数传递,我可以访问该变量。

这是故意的,与“宏观卫生”有关吗?如果是这样,那么--pretty=expanded以某种特殊方式标记这些“内部”变量可能有意义吗?

4

1 回答 1

12

是的,这是宏观卫生。在宏中声明的标识符在宏之外不可用(反之亦然)。Rust 宏不是 C 宏(也就是说,Rust 宏不仅仅是美化的文本替换)。

也可以看看:

于 2018-12-11T01:48:39.627 回答