除非传入变量名,否则为什么不能访问在宏中声明的变量?

时间:2018-12-11 01:21:10

标签: macros rust rust-macros

我有这个宏:

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;

在随后的代码中,我可以正常打印xyz,但是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中标记此类“内部”变量可能有意义?

1 个答案:

答案 0 :(得分:6)

是的,这是宏观卫生。在宏内声明的标识符在宏外不可用(反之亦然)。 Rust宏不是C宏(也就是说,Rust宏不仅仅是修饰文字)。

另请参阅: